已回答:感谢@AndyProwl向我指出了一些问题,我发现问题出在我的ScreenImage.Update()函数中。我在为该函数编写实现时来回失败(因为ScreenImage不需要更新,只需要绘制)并且在我删除实现时不知何故意外地将Update函数留在我的界面上......
让你成为孩子的警告。 〜你知道的越多〜
原始问题:
我正在制作游戏,并且我有一个Screen
对象,用于跟踪给定屏幕上的项目(即图像,文本,菜单选项等)。我的目标是以抽象Screen
对象的形式将这些项传递给ScreenElements
,而这些对象又可以定义为更具体的对象,如ScreenImage
或{{1等等。
我试图获取向量(基本上将其视为ScreenElements的堆栈),通过使其成为指向基础对象的指针的向量来使用不同的继承类,但是这意味着我必须声明从函数外部继承ScreenText
的对象,因此当声明超出范围时,指针不会变为无效。那么我在我的Screen对象中创建了一个函数,允许我使用“AddElement”,我认为相同的指针方法可以工作......显然没有。
这是我的源代码,只是为了清理。这是Screen.h。
ScreenElements
我的Screen.cpp文件
#ifndef SCREEN_H
#define SCREEN_H
#include <vector>
#include "ScreenElement.h"
class Screen
{
protected:
bool enabled;
std::vector<ScreenElement*> screen_elements;
public:
//Gameloop Functions
void Init();
void Update(int ticks); //Enabled will likely determine if this is called
void Draw(); //And this perhaps on a visible bool
void Destroy();
//Concept functions
//void TransitionIn(data);
//void TransitionOut(data);
void AddElement(ScreenElement *Element); //function in question
//Allow external use of enabled feature
void ToggleEnable(bool Enabled) { enabled = Enabled; }
bool IsEnabled() { return enabled; }
};
#endif // SCREEN_H
我需要我的AddElement来处理任何继承的ScreenElement形式,例如ScreenImage,并将其存储到矢量中。
编辑:我想我也应该从我的ScreenElement类中提供一些源代码。当我试图添加一个虚拟析构函数时,除了第一个似乎与继承类的构造函数相关的函数之外,它只引起了另一个错误(在函数ScreenImage :: ScreenImage()未定义的引用'vtable for ScreenImage')。所以这是我的ScreenElement.h
#include "Screen.h"
void Screen::Init()
{
enabled = true;
}
void Screen::Update(int ticks)
{
for(int i = 0; i < screen_elements.size(); i++)
screen_elements[i]->Update(ticks);
}
void Screen::Draw()
{
for(int i = 0; i < screen_elements.size(); i++)
screen_elements[i]->Draw();
}
void Screen::Destroy()
{
screen_elements.clear();
}
void Screen::AddElement(ScreenElement *Element)
{
screen_elements.push_back(Element);
}
反过来用于创建ScreenImage.h
#ifndef SCREENELEMENT_H
#define SCREENELEMENT_H
#include "Globals.h"
class ScreenElement
{
protected:
s_Position screen_position;
bool enabled;
public:
virtual void Update(int ticks) {}
virtual void Draw() {}
virtual void Destroy() {}
void ToggleEnable(bool Enabled) { enabled = Enabled; }
bool IsEnabled() { return enabled; }
};
#endif // SCREENELEMENT_H
在ScreenImage.cpp中有自己的基本函数实现。
答案 0 :(得分:0)
初始化一个名为SplashScreen的Screen实例和一个名为SplashScreen_Image的ScreenImage后,我使用“SplashScreen.AddElement(&amp; ScreenImage);”然后它引发了一个关于'未定义引用“vtable for ScreenImage”
的错误
从您报告的错误判断,问题似乎是您为类的某个虚函数提供了声明,而不是定义。
例如,尝试编译以下代码将产生一个非常类似的错误:
struct X
{
virtual void foo() { }
};
struct Y : X
{
virtual void foo(); // Missing definition...
};
int main()
{
Y y;
y.foo(); // The compiler will complain about undefined reference
// to vtable for Y...
}
以下是相应的live example。