好的,我一直在寻找,但不能因为我的智慧找到原因,为什么这不应该工作:
基类(misc / interface / handler.h)
#ifndef __t__MISC_VIRTUAL_HANDLER_H
#define __t__MISC_VIRTUAL_HANDLER_H
#pragma message("Starting with 'handler.h'")
namespace t {
namespace misc {
namespace interface {
class Handler {
public:
Handler();
virtual ~Handler();
virtual int setup() = 0;
virtual int teardown() = 0;
virtual int update() = 0;
protected:
private:
};
}
}
}
#pragma message("Ending with 'handler.h'")
#endif // __t__MISC_VIRTUAL_HANDLER_H
派生类(graphics / handler.h):
#ifndef __t_GRAPHICS_HANDLER_H
#define __t_GRAPHICS_HANDLER_H
#include "../misc/interface/handler.h"
namespace t {
namespace graphics {
class Handler: public t::misc::interface::Handler {
public:
Handler();
virtual ~Handler();
int getResolutionX() { return m_resolutionX; }
int getResolutionY() { return m_resolutionY; }
bool getFullscreen() { return m_isFullscreen; }
protected:
private:
unsigned int m_resolutionX, m_resolutionY;
bool m_isFullscreen;
}; // class Handler
} // namespace graphics
} // namespace t
#endif // __t_GRAPHICS_HANDLER_H
......这似乎相当微不足道。
派生类实现(graphics / handler.cpp):
#include "handler.h"
t::graphics::Handler::Handler(): t::misc::interface::Handler() {
}
t::graphics::Handler::~Handler() {
}
......这也应该是微不足道的,但会产生错误:
src\graphics\handler.cpp|5|undefined reference to `t::misc::interface::Handler::Handler()'
我正在使用带有代码块的MinGW以及CB使用的标准设置,我尝试使用测试类构建相同的情况,并且在相同的环境和使用vanilla g ++的Linux中按预期工作。
答案 0 :(得分:5)
我在代码中看不到t::misc::interface::Handler::Handler()
的任何实现 - 它将由继承类的构造函数调用,因此需要实现。链接器找不到它,所以它会抱怨。
只需改变:
Handler();
virtual ~Handler();
在抽象类中:
Handler() {}
virtual ~Handler() {}
你准备好了。
答案 1 :(得分:3)
顺便说一下,以两个下划线开头的标识符在C ++中是非法的(因为它们是为编译器保留的)。在实践中,他们不应该在预处理器中出现问题,但最好在这里安全地犯错:只是不要使用它们。