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>您的代码有几个问题。
  • 宇宙需要一个虚拟的析构函数
  • 必须在堆上创建实例
  • 您使用了错误的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();
    
    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]);