我知道已经被问了很多,我用Google搜索但是无法将所有内容放在一起。也许是因为不可能做到,我想要什么?
我有
struct Universe
{
}
和
struct Atom: Universe
{
}
struct Molecule: Universe
{
}
Universe U;
Atom A;
Molecule M;
_atoms = vector<Universe*>(3);
_atoms.push_back(&U);
_atoms.push_back(dynamic_cast<Universe*>(&A));
_atoms.push_back(dynamic_cast<Universe*>(&M));
auto THIS_IS_ATOM = _atoms[1];
此代码在很多方面很可能是错误的。但我的想法是存储这样的不同派生结构,然后从数组或列表中访问它们,而不需要任何数据集或类截断。我想从数组中获取一些元素,比如_atoms [1],并且能够知道这个结构是什么类型(Universe,或Atom)和e.t.c
我应该如何在C ++中正确地完成它?
答案 0 :(得分:0)
您的代码有几个问题。
这是一个应该有效的解决方案:
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();
附录:如果您需要非多态地处理向量中的对象,可以使用静态强制转换将它们强制转换为适当的类型:
Atom* a = static_cast<Atom*>(_atoms[1]);
编辑:建议使用智能指针向量,而不是使用原始指针向量,例如std :: unique_ptr或std :: shared_ptr,具体取决于您尝试建模的所有权语义。 / p>