在函数中使用继承的类?

时间:2013-03-27 23:44:25

标签: c++ function inheritance polymorphism

已回答:感谢@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中有自己的基本函数实现。

1 个答案:

答案 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