对象,继承,dynamic_cast需要建议

时间:2013-07-27 14:49:07

标签: c++ inheritance struct dynamic-cast

我知道已经被问了很多,我用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 ++中正确地完成它?

1 个答案:

答案 0 :(得分:0)

您的代码有几个问题。

  1. Universe需要一个虚拟析构函数。
  2. 您必须在堆上创建实例。
  3. 您使用的是错误的std :: vector构造函数。
  4. 这是一个应该有效的解决方案:

    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>