Глобальная переменная своего типа - c++

243
13 октября 2017, 16:14

Завожу глобальную переменную собственноручно написанного класса в файле main.cpp следующим образом:

extern Next temp;

И определяю её в нужных мне h-файлах:

Next temp;

Компилятор жалуется:

 Ошибка C2146   синтаксическая ошибка: отсутствие ";" перед идентификатором "temp"  
 Ошибка C4430   отсутствует спецификатор типа - предполагается int. Примечание. C++ не поддерживает int по умолчанию

таких ошибок много. Прошу помощи. P.S.: так с любым моим классом. P.S.S.: да, я в курсе, глобальные переменные зло. Но тут она требуется. Отвечу сразу, для чего. Для использование я оконной процедуре WndProc, которая находится в другом файле.

Минимальный(!!!) пример:

main.cpp

#include <d3d9.h>
#include <d3dcompiler.h>
#include <windows.h>
#include "d3dUtility.h"
#pragma comment(lib, "d3d9.lib")
using namespace d3d;
D3DXDevice dxDevice;
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, int iCmdShow)
{
    return 0;
}

d3dUtility.h

#pragma once
#include <Windows.h>
#include <d3d9.h>
#include <d3dcompiler.h>
#include "function.h"
namespace d3d
{
    class D3DXDevice
    {
        IDirect3DDevice9* Device; // указатель на созданное устройство
    public:
        D3DXDevice();
        IDirect3DDevice9* getDevice();
        ~D3DXDevice();
    };
};

d3dUtility.cpp

#include "d3dUtility.h"
namespace d3d
{
    D3DXDevice::D3DXDevice() :Device(nullptr) {}
    IDirect3DDevice9 * D3DXDevice::getDevice()
    {
        return this->Device;
    }
    D3DXDevice::~D3DXDevice()
    {
        this->Device->Release(); // удаляем устройство
    }
};

function.h

#pragma once
#include "d3dUtility.h"
#include <windows.h>
using namespace d3d;
extern D3DXDevice dxDevice;
bool Display();

test.cpp

#include "function.h"
bool Display() 
{
    if (dxDevice.getDevice()) 
    {
        dxDevice.getDevice()->Clear(0, 0, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 5, 1.0f, 0); 
        dxDevice.getDevice()->Present(0, 0, 0, 0); 
    }
    return true; 
}

P.S.: увы, но это правда минимальный пример. P.S.S.: VS 2017.

Answer 1

Тут вот какое дело, если я правильно понял текст программы. В файле d3dUtility.h Вы подключаете файл function.h, в котором объявлена внешняя переменная. Но дело в том, что на этот момент класс еще даже не объявлен. Отсюда и ошибка. Выход: не включать сюда function.h либо делать опережающее объявление класса D3DXDevice.

READ ALSO
Работа с частью вектора как с вектором

Работа с частью вектора как с вектором

Есть стандартный вектор, допустим типа std::vector<int>Есть функция void plusOne(std::vector<int>::iterator it1, std::vector<int>::iterator it2), прибавляющая всем элементам...

306
Как ссылаться на DLL в решении в VS?

Как ссылаться на DLL в решении в VS?

В VS2013 есть решение с проектами на С++Один главный, а остальные планируется оформить в виде динамических библиотек

322
Базовый класс Фигура

Базовый класс Фигура

Базовый класс Фигура с полем «название фигуры» и методом «Печать названия»Производный класс Шар с полем Радиус

270
Олимпиадная задача проходит на 80%

Олимпиадная задача проходит на 80%

Определить координаты малейшего интервала с целочисленными координатами концов, на который приходятся значения элементов действительной...

200