【问题标题】:How to make a list of objects which all inherit from one base class如何制作所有从一个基类继承的对象列表
【发布时间】:2015-09-01 19:37:55
【问题描述】:

我有一个主要的抽象类和 4 个子类,它们都继承自抽象类。 我想制作一个列表,其中一个元素可以是这 4 个类中的任何一个。

Test1.h

class Test {
public:
    Test();
    virtual void someFunc();

    void getTest();
    void setTest(int test);

protected:
    int test;
};

Test2.h:

#include "Test.h"

class Test2 : public Test{
public:
    Test2();
    void someFunc();

    int otherFunc();

};

还有Test3、Test4和Test5...

来源.cpp:

#include <iostream>
#include "Test1.h"
#include "Test2.h"
#include "Test3.h"
#include "Test4.h"
#include "Test5.h"

int main() {
    list<Test> testList; //does not work
    Test2 t = Test2();
    Test3 t3 = Test3();
    Test4 t4 = Test4();
    testList.push_back(t);
    testList.push_back(t4);
}

有没有办法制作一个可以包含所有这些元素的列表?

【问题讨论】:

  • 您是否希望列表拥有对象(即您是否希望在删除列表时删除它们)?

标签: c++ visual-studio list inheritance


【解决方案1】:

您可以创建基类Test 指针的向量,例如:

std::vector<Test*>

如果可以的话,我宁愿推荐使用智能指针,例如:

std::vector<std::unique_ptr<Test>>

【讨论】:

  • 成功了!有没有办法可以设置向量的大小随着元素的添加而动态增加,而不必设置初始大小?
  • 使用std::vector,您不必自己增加大小。 push_back() 将为您完成工作。所以一定要使用std::vector
【解决方案2】:

只要您不希望列表拥有对象,您就可以使用基类指针向量:

std::vector<Test*> testList;
Test2 t = Test2();
Test4 t4 = Test4();
testList.push_back(&t);
testList.push_back(&t4);

如果您希望列表拥有您需要动态分配对象的对象,则基类需要有一个虚拟析构函数,并且您需要记住删除指针或使用智能指针:

class Test {
public:
    virtual void someFunc();
    virtual ~Test(){}
};

std::vector<std::unique_ptr<Test>> testList;
testList.push_back(std::make_unique<Test2>());
testList.push_back(std::make_unique<Test4>());

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-24
    • 1970-01-01
    • 1970-01-01
    • 2020-04-29
    • 1970-01-01
    • 2010-09-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多