0

我知道这已经被问了很多,我用谷歌搜索但无法将所有内容放在一起。也许是因为不可能做,我想要什么?

我有

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)等等

我应该如何在 C++ 中正确地做到这一点?

4

1 回答 1

0

您的代码有几个问题。

  1. Universe 需要一个虚拟析构函数。
  2. 您必须在堆上创建实例。
  3. 您使用了错误的 std::vector 构造函数。

这是一个应该有效的解决方案:

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,具体取决于您尝试建模的所有权语义。

于 2013-07-27T14:58:05.613 回答