假设某个对象可以被其他对象引用(或引用)。目前我使用成员变量来记录其引用次数。引文计数用于确定是否可以删除对象。
class Cited
{
public:
int m_citationCount;
};
我将变量公之于众。当引用该对象时,它会增加1.如果它被取消,则减少1.使变量公开似乎不合适。如果它只有一种类型的citer,我可以使citer类型成为朋友。但是,可能存在各种各样的含量。有没有更好的主意呢?
更多信息:这些对象是树结构中的项目或节点。一些节点可以引用其他节点。例如,一个节点被称为空气,它代表具有密度等特性的材料空气。称为背景的节点可以引用空中节点以显示背景是空气。树上的操作是可撤消的。如果用户删除后台节点,则只会将其推入撤消堆栈。它并没有真正删除。
答案 0 :(得分:3)
让自己保持悲痛,只使用C ++的shared_ptr
模板。
好的,既然问题已经改变,答案也需要。
基本上,您只需要采用一些策略:
shared_ptr
每当您需要跟踪节点时,请使用shared_ptr<Node>
,其中Node
是您的节点类。例如,如果Node
需要引用另一个Node
,则有 shared_ptr<Node>
来执行此操作。例如,关闭您的示例,您可以:
class Material:public Node { //这里的材料属性 };
类背景:public Node { //这里的材料属性 void SetMaterial(shared_ptr mat); };
void set_stage(){ shared_ptr air = new Material(/ 构造函数参数 /); shared_ptr skyBG = new Background(/ 构造函数参数 /); skyBG-&GT; SetMaterial(空气); }
要获得撤消支持,请记住撤消堆栈通常是一堆操作,每个操作都包含足够的信息来确定所执行的操作(因此可以撤消)。如果一个动作涉及一个节点,那么它应该(像其他一切一样)使用shared_ptr<Node>
来引用它。
答案 1 :(得分:1)
你可以使用带有自定义删除器的shared_ptr计算出一个方案,当计数降到零时,它会做你需要的任何事情。
或者您可以手动滚动。至少,将count变量设为私有并提供公共方法来完成工作可能是个好主意:
class Cited
{
public:
void CreateCitation()
{
++m_citationCount;
}
void RemoveCitation()
{
--m_citationCount;
if(m_citationCount == 0)
{
// ... whatever special logic happens at zero.
}
}
private:
int m_citationCount;
};
但是,可以通过创建一个Citation类来进一步采取行动,就像智能指针一样。这样的类将由CreateCitation返回,将保留指向Cited对象的指针,并在其析构函数中调用RemoveCitation。
例如:
class Citation
{
public:
Citation(Cited* c) : m_cited(c) {}
~Citation()
{
m_cited->RemoveCitation();
}
// ... whatever else to make this more usable.
Cited* m_cited;
};
这些只是基本的想法。有许多方面需要完善(例如处理Citation类的复制构造函数和赋值运算符)。