插入链表哪个智能指针来保持多态性?

问题描述 投票:0回答:1

我正在编写一个简单的编译器,并且我有一个基类:

class Instruction
{
  public:  
    virtual std::string get_name() const = 0;
};

我创建了一条指令,例如计算

class Compute
: public Instruction
{
  public:  
    std::string get_name() const override
    { return "Compute"; }
};

我想创建一个容器,比如

std::list
,其中包含指向使用智能指针的指令的指针。

一个功能是迭代容器,在所有指令上调用虚函数

get_name()
,比如说打印所有指令名称。 (另一个想法是在所有指令上调用
execute
validate
函数)。

  1. 我应该使用什么智能指针?
  2. 指针是如何插入
    std::list
    的?
  3. 引用指针仍然会调用多态性吗?

注意:在互联网上搜索“c++ 智能指针链表”会找到有关使用智能指针将节点链接在一起的答案。 我正在谈论使用智能指针作为节点中的数据。

注意:“什么是智能指针以及什么时候应该使用智能指针”的示例不涵盖多态性和插入容器的智能指针的情况。

目标对象(被指向的对象)的生命周期就是容器或程序的生命周期。

c++ containers polymorphism smart-pointers stdlist
1个回答
0
投票

Instruction
添加虚拟析构函数并使用
unique_ptr

使用 make unique 插入,或移动 uniqie ptr,或放置原始指针。 方法有很多。

如果您的指令对象是不可变的(创建后完全

const
),请考虑共享 ptr - 在其他情况下使用共享 ptr 来“解决生命周期问题”是不明智的,因为根据我的经验,它隐藏了问题而不是解决问题。

请注意,仅当列表中间的插入/删除发生频率远远高于遍历(包括遍历查找或插入某些内容)时,或者需要绝对对象地址稳定性时,才应使用

std::list
。 这是一个极其罕见的要求:简短的形式是不要使用 std 列表。

© www.soinside.com 2019 - 2024. All rights reserved.