c++中父类对象的集合
c++ collection of parent class object
我有一个父类a和两个派生类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;
}
与其保持两个单独的向量A1s和A2s,是否有一种方法将这两个向量组合起来?我想矢量或矢量,但无论哪种方式都可能丢失对象当A1s或A2s调整大小(我假设)。
任何想法?
你可以使用一个智能指针的向量指向基类型
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:
class A1 : public class A {};
应:class A1 : public A {};
可以使用指针向量
class B {
public:
std::vector<A*> _AXs;
};
同时接受A1和A2类型的指针。
注意,在这种情况下,应该将A
类的析构函数设置为virtual。如果你不这样做,当你试图删除一个A*
对象时,程序不能猜出什么是真正的类型。
class A {
public:
virtual ~A() {}
};
您可以使用其他人所说的,如果您仍然希望能够将底层A
指针用作A1
或A2
,则可以使用称为visitor
的设计模式。访问者模式并不是为此而设计的,但是这样使用是很好的。
相关文章:
- 保留计时器集合(对象与指针)的最佳方法
- 在具有自定义对象的集合中查找值
- 如何处理C 中对象的混合集合
- 如何创建异质对象的集合
- 如果对象尚未在集合中,则创建一个对象
- C++内存中的大型对象集合是否正常
- C++集合对象和 iStream 文件输入
- 只有Arduino的第一个对象在包含在另一个对象的集合/数组中时会丢失其数据属性值
- C 11按几个属性的自定义对象集合
- 位掩码:通过集合方法设置对象的不同状态
- 可以在C++中更改存储在集合中的对象的非关键部分.如何在java中进行类似操作
- 具有不同接口的对象的集合
- 集合中的不可变对象(C++ 和 Qt)
- C++维护子类对象的混合集合
- 无法将对象上的指针添加到集合
- 映射/集合迭代器不兼容-检查对象是否在映射中
- 如何将对象插入到集合中
- 如何在C++派生对象的集合中进行搜索和赋值
- boost::lockfree::队列似乎没有释放内存,尽管每个集合对象上的析构函数都被调用
- 如何在MPI_send中发送集合对象