【问题标题】:Storing instance of abstract object存储抽象对象的实例
【发布时间】:2016-08-15 11:19:07
【问题描述】:
class element
{
public:
    element();
    virtual void foo() = 0;
};

class bar : public element
{
public:
    bar();
    void foo() override
    {
        // Stuff
    }
};

class baz : public element
{
public:
    bar();
    void foo() override
    {
        // Stuff
    }
};

我希望将 bar 的实例和 baz 的实例存储在同一个向量或列表中。

vector<element> elements;
bar a = bar();
baz b = baz();

elements.push_back(a);
elements.push_back(b);

我知道上面的代码行不通,但我正在寻找具有这种结构的东西。

我在某处读到您可以存储unique_ptr&lt; element&gt; 的向量,但我不知道如何将 bar 或 baz 的实例转换为元素的唯一指针。

抱歉,如果这是重复的,我尝试寻找解决方案,但找不到任何东西。

【问题讨论】:

  • 你知道如何创建 any std::unique_ptr 对象吗?从那里开始,然后考虑如何将其存储在您的向量中。
  • this 是否回答您的问题:
  • 我认为您在这里缺少的要点是如何使用继承和多态性,例如如果您想要多态处理,您必须使用基类的指针或引用来指向/引用派生类。此处使用std::unique_ptr 保存对象的细节仅在第一点之后。

标签: c++ vector abstract-class


【解决方案1】:

使用std::make_unique 创建由unique_ptrs 管理的对象。

std::vector<std::unique_ptr<element>> vector; // Empty vector

vector.push_back(std::make_unique<bar>()); // Push a new bar
vector.push_back(std::make_unique<baz>()); // Push a new baz

【讨论】:

  • 如果我已经有一个 bar 或 baz 的实例怎么办。我必须创建一个新实例吗?
  • @ConradJLudgate 是的。一个实例只能存在于一个地方,所以你必须复制(或移动)它。 make_unique 将其参数转发给新实例的构造函数,因此您可以使用 std::make_unique&lt;bar&gt;(a)a 复制构造新的 bar(分别是 std::move(a) 移动构造它)。
猜你喜欢
  • 2015-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-28
  • 1970-01-01
  • 2012-02-28
相关资源
最近更新 更多