C++ 对象、继承、动态\u cast需要建议
我知道有人问了很多问题,我在谷歌上搜索了一下,但没能把所有的东西都放在一起。也许因为这是不可能的,我想要什么 我有C++ 对象、继承、动态\u cast需要建议,c++,inheritance,struct,dynamic-cast,C++,Inheritance,Struct,Dynamic Cast,我知道有人问了很多问题,我在谷歌上搜索了一下,但没能把所有的东西都放在一起。也许因为这是不可能的,我想要什么 我有 struct Universe { } 及 struct-Atom:Universe { } 结构分子:宇宙 { } 宇宙U; 原子A; 分子M; _原子=矢量(3); _原子。推回(&U); _原子。推回(动态施法(&A)); _原子。推回(动态施法(&M)); 自动此_为_原子=_原子[1]; 这段代码很可能在许多方面是错误的。但我的想法是像这样存储不同的派生结构,然后从数
struct Universe
{
}
及
struct-Atom:Universe
{
}
结构分子:宇宙
{
}
宇宙U;
原子A;
分子M;
_原子=矢量(3);
_原子。推回(&U);
_原子。推回(动态施法(&A));
_原子。推回(动态施法(&M));
自动此_为_原子=_原子[1];
这段代码很可能在许多方面是错误的。但我的想法是像这样存储不同的派生结构,然后从数组或列表中访问它们,而不需要任何数据丢失或类截断。我想从数组中得到一些元素,比如_原子[1],并且能够知道这个结构是什么类型(宇宙或原子)和e.t.c
<如何在C++中正确地处理它?< p>您的代码有几个问题。
struct Universe {
virtual ~Universe() {} // otherwise Atom and Molecule will not be deleted properly
}
struct Atom : Universe {
}
struct Molecule : Universe {
}
std::vector<Universe*> _atoms; // you don't need to pass anything in the constructor
_atoms.reserve(3); // but if you want to make sure that the vector has exactly a capacity of 3, use this
_atoms.push_back(new Universe());
_atoms.push_back(new Atom());
_atoms.push_back(new Molecule());
auto this_is_atom = _atoms[1]; // will actually be equivalent to
Universe* this_is_atom = _atoms[1];
// finally you must delete all the instances which you created on the heap
while (!_atoms.empty()) delete _atoms.back(), _atoms.pop_back();
struct-Universe{
virtual~Universe(){}//否则将无法正确删除原子和分子
}
结构原子:宇宙{
}
结构分子:宇宙{
}
std::向量_原子;//您不需要在构造函数中传递任何内容
_原子储备(3);//但是如果你想确保向量的容量正好是3,就用这个
_原子。推回(新宇宙();
_原子。推回(新原子());
_原子。推回(新分子();
自动此_为_atom=_atoms[1];//实际上相当于
宇宙*这是原子=,原子[1];
//最后,必须删除在堆上创建的所有实例
而(!_atoms.empty())删除_atoms.back(),_atoms.pop_back();
附录:如果需要以非多态方式处理向量中的对象,可以使用静态转换将其转换为适当的类型:
Atom* a = static_cast<Atom*>(_atoms[1]);
Atom*a=static_cast(_atoms[1]);
编辑:不使用原始指针向量,建议使用智能指针向量,例如std::unique\u ptr或std::shared\u ptr,具体取决于您试图建模的所有权语义。您的
public
关键字,它不起任何作用。(struct
默认为public
)。您可能不应该建议人们创建一个原始指针的std::vector
——只需创建一个std::vector
@Yakk,感谢关于默认情况下公开结构继承的提示,我不知道这一点。相应地编辑了答案。关于智能指针,我原则上同意,但我不想把OP和智能指针混为一谈。OP看起来是个初学者+非常感谢大家,我从这个例子中学到并证实了很多。雅克,关于独特指针的观点很好,我最好习惯一直使用它们。
Atom* a = static_cast<Atom*>(_atoms[1]);