ошибка C2504: 'БАЗОВЫЙ КЛАСС': неопределенный базовый класс

Я проверил сообщение, подобное этому, но связь отличалась, вопрос никогда не решался. Проблема с моим состоит в том, что по некоторым причинам компоновщик ожидает там быть определением для базового класса, но базовый класс является просто интерфейсом. Ниже ошибка в, он - полнота

c:\users\numerical25\desktop\intro todirectx\godfiles\gxrendermanager\gxrendermanager\gxrendermanager\gxdx.h(2) : error C2504: 'GXRenderer' : base class undefined

Ниже код, который показывает, как заголовки связываются друг с другом

GXRenderManager.h

#ifndef GXRM
#define GXRM
#include <windows.h>
#include "GXRenderer.h"
#include "GXDX.h"
#include "GXGL.h"

enum GXDEVICE {
    DIRECTX,
    OPENGL
};

class GXRenderManager {
public:
    static int Ignite(GXDEVICE);

private:
    static GXRenderer *renderDevice;

};

#endif

в верхней части GxRenderManager существует GXRenderer, окна, GXDX, заголовки GXGL. Я принимаю включением их всех в этом документе. они все связываются друг с другом, как будто они были всеми в том же документе. исправьте меня, если я - неправильная причина, это то, как представление заголовки. Хождение дальше...

GXRenderer.h

class GXRenderer {

public:
    virtual void Render() = 0;
    virtual void StartUp() = 0;

};

GXGL.h

class GXGL: public GXRenderer {

public:
    void Render();
    void StartUp();
};

GXDX.h

class GXDX: public GXRenderer {
public:
    void Render();
    void StartUp();
};

GXGL.cpp и GXDX.cpp соответственно

#include "GXGL.h"

void GXGL::Render()
{

}

void GXGL::StartUp()
{

}

//...Next document

#include "GXDX.h"


void GXDX::Render()
{

}

void GXDX::StartUp()
{

}

Не уверенный, что продолжается. Я думаю, как я связываю документы, я не уверен.

6
задан numerical25 16 June 2010 в 13:39
поделиться

2 ответа

Проблема в Вам необходимо иметь #include "GXRenderer.h" в верхней части обоих: GXGL.h и GXDX.h.

Базовый тип должен быть определен, а не просто объявлен перед определением производного типа.

Между прочим, ошибка - это ошибка компиляции, а не ошибка связывания.

Правка: О переопределении типа вашего класса:

в верхней части каждого файла заголовка вы должны иметь #pragma once .

Директива #pragma once указывает, что файл будет включен компилятором в сборку не более одного раза.

4
ответ дан 17 December 2019 в 00:03
поделиться

Вы включили их все в GXRenderManager.h, что означает, что GXRenderManager.h в порядке.

Но вы забыли включить их все в GXGL.cpp и GXDX.cpp. В этих .cpp файлах класс GXRenderer совершенно неизвестен.

Существует по крайней мере две "школы" стратегий #include. Одна говорит, что заголовочный файл должен включать все, что необходимо для его компиляции. Это означает, что GXGL.h и GXDX.h должны включать GXRenderer.h. Если бы вы следовали этой стратегии, ваши GXGL.cpp и GXDX.cpp были бы в порядке, как они есть сейчас.

Другая "школа" говорит, что заголовочные файлы вообще не должны включать друг друга, т.е. все включения должны осуществляться через файлы .cpp. На первый взгляд можно предположить, что ваши GXGL.h и GXDX.h следуют этой стратегии (поскольку вы ничего не включаете в них), но тогда ваш GXRenderManager.h выглядит совершенно иначе.

Вам нужно решить, какой стратегии вы пытаетесь следовать, и следовать ей. Я бы рекомендовал первую.

2
ответ дан 17 December 2019 в 00:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: