我有一个父类A和2派生类A1和A2:
class A {
}
class A1 : public class A {}
class A2 : public class A {}
在另一个B类中,我想保留一个由对象A1或A2组成的集合。
class B {
vector<A1> _A1s;
vector<A2> _A2s;
}
有没有办法将这两个向量组合起来,而不是保留2个独立的向量A1s和A2s?我想到了矢量或矢量,但是当A1或A2调整大小时,无论哪种方式都可能丢失对象(我假设)。
有什么想法吗?
答案 0 :(得分:3)
您可以使用基本类型的智能指针向量
std::vector<std::shared_ptr<A>> a_ptr;
注意: 您需要将虚拟析构函数添加到A
class A {
public:
virtual ~A() {}
};
用法:
struct B {
public:
B() {
a_ptr.push_back(std::shared_ptr<A>(new A1));
a_ptr.push_back(std::shared_ptr<A>(new A2));
}
private:
std::vector<std::shared_ptr<A>> a_ptr;
};
int main(int argc, char* argv[])
{
B b;
return 0;
}
同样,您在课程定义后错过了;
,并且在下面的语句中您在A前面有额外的关键字类:
class A1 : public class A {};
应该是:
class A1 : public A {};
答案 1 :(得分:0)
您可以使用指针
的向量class B {
public:
std::vector<A*> _AXs;
};
它将接受A1和A2指针类型。
请注意,在这种情况下,您应该设置A
类虚拟的析构函数。
如果不这样做,当您尝试删除A*
对象时,程序无法猜出实际类型是什么。
class A {
public:
virtual ~A() {}
};
答案 2 :(得分:0)
如果您仍希望能够将基础visitor
指针用作A
或A1
,则可以使用其他人所说的内容以及名为A2
的设计模式}。访问者模式并非真正为此设计,但以这种方式使用它是很好的。