ошибка C2504: «BASECLASS»: базовый класс не определен - PullRequest
6 голосов
/ 16 июня 2010

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

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, windows, 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()
{

}

Не уверен, что происходит.Я думаю, это то, как я связываю документы, я не уверен.

Ответы [ 3 ]

4 голосов
/ 16 июня 2010

Проблема в том, что вам нужно иметь #include "GXRenderer.h" вверху обоих: GXGL.h, а также GXDX.h.

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

Кстати, ошибка - это ошибка компиляции, а не ошибка компоновки.

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

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

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

2 голосов
/ 16 июня 2010

Вы включили их все в 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 выглядит совершенно иначе.

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

1 голос
/ 15 октября 2012

Я получил ошибку C2504: «CView»: базовый класс не определен где CView не является непосредственно моим базовым классом, от которого я наследую.

Я наследую mYClass от MScrollView, «в этом отношении любой класс, который не является базовым классом, - это то, что нужно отметить здесь» но ошибка это C2504. Когда я включил его в заголовок, где возникает эта проблема, эта проблема решена.

#include "stdafx.h"

где stdafx.h имеет #include, в котором содержатся все определенные базовые классы ... надеюсь, этот ответ разрешит всех, кто столкнулся с этой проблемой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...