【发布时间】:2019-04-27 09:24:07
【问题描述】:
我需要将派生类的元素添加到指向抽象类的共享指针列表中。
我一直在尝试这个。我知道我正在尝试在下面的示例中创建抽象类的实例,但我不知道如何使它工作。
简化的类如下所示:
using namespace std;
class Abstract
{
public:
virtual string toString() const = 0;
};
class A : public Abstract
{
public:
A(int a, int b) : a(a), b(b)
{}
string toString() const { return "A"; }
private:
int a;
int b;
};
class B : public Abstract
{
public:
B(int b) : b(b)
{}
string toString() const { return "B"; }
private:
int b;
};
问题出在下面的类中:
class Data
{
public:
Data(const string & name) : name (name)
{}
Data AddData ( const Abstract & a )
{
//Need to fix next line
l1.push_back(make_shared<Abstract>(a));
return (*this);
}
private:
list<shared_ptr<Abstract>> l1;
string name;
};
我想避免 RTII 和 dynamic_cast。我对不同的解决方案持开放态度。我只需要以某种方式将不同类型的元素存储到单个容器中。
我需要像这样使用类数据:
Data test("Random Name");
test.AddData(A(1,2))
.AddData(B(3))
.AddData(B(4));
【问题讨论】:
-
您不能创建抽象类的实例。如果要实例化
A或B对象,您需要以某种方式在Data中做出决定。
标签: c++ list polymorphism abstract-class shared-ptr