包含抽象超类列表的类,我需要#include所有子类吗?

时间:2014-05-25 13:37:02

标签: c++ qt inheritance

我正在进行桌面游戏。桌面游戏有一个类Board,其中包含QList<Tile*>Tile是一个抽象类,它有许多子类来指示不同类型的tile,它们具有不同的功能。现在,由于Board的构造函数需要将这些子类的所有对象放入QList<Tile*>,我是否需要在Board中包含每个子类?

如果是这样,我很确定这是不好的做法,那么有没有办法绕过这个?

1 个答案:

答案 0 :(得分:1)

  

我是否需要在Board中包含每个子类?

如果您尝试使用子类,则必须包含它。我觉得这里没有什么可以绕过的。

如果需要在多个地方完成,即不仅仅是在构造函数中,那么你可以做的一件事就是将包含放入共享的包含中。然后,几个地方将包括共享包含。

例如,遗憾的是,Qt最终用户包括整个模块以避免几行包含。恕我直言,这是不好的做法。

以下是您案例的示例。

的main.cpp

#include "test.h"
#include "foo.h"
#include "bar.h"
#include "baz.h"

int main()
{
    Test *test1 = new Foo();
    Test *test2 = new Bar();
    Test *test3 = new Baz();
    return 0;
}

test.h

#ifndef TEST
#define TEST
class Test
{
    public:
        virtual ~Test() {}
};
#endif

foo.h中

#ifndef FOO
#define FOO
#include "test.h"
class Foo : public Test
{
};
#endif

bar.h

#ifndef BAR
#define BAR
#include "test.h"
class Bar : public Test
{
};
#endif

baz.h

#ifndef BAZ
#define BAZ
#include "test.h"
class Baz : public Test
{
};
#endif

main.pro

TEMPLATE = app

TARGET = main
CONFIG -= qt
QT -= core gui
HEADERS += bar.h baz.h foo.h test.h
SOURCES += main.cpp

构建并运行

qmake && make && ./main

尝试删除任何包含或用main.cpp文件中的forward声明替换它,您将看到它不再编译。