我正在编写一个简单的编译器,并且我有一个基类:
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
函数)。
std::list
的?注意:在互联网上搜索“c++ 智能指针链表”会找到有关使用智能指针将节点链接在一起的答案。 我正在谈论使用智能指针作为节点中的数据。
注意:“什么是智能指针以及什么时候应该使用智能指针”的示例不涵盖多态性和插入容器的智能指针的情况。
目标对象(被指向的对象)的生命周期就是容器或程序的生命周期。
向
Instruction
添加虚拟析构函数并使用 unique_ptr
。
使用 make unique 插入,或移动 uniqie ptr,或放置原始指针。 方法有很多。
如果您的指令对象是不可变的(创建后完全
const
),请考虑共享 ptr - 在其他情况下使用共享 ptr 来“解决生命周期问题”是不明智的,因为根据我的经验,它隐藏了问题而不是解决问题。
请注意,仅当列表中间的插入/删除发生频率远远高于遍历(包括遍历查找或插入某些内容)时,或者需要绝对对象地址稳定性时,才应使用
std::list
。 这是一个极其罕见的要求:简短的形式是不要使用 std 列表。