如何计算对象的引文编号?

时间:2014-07-01 03:39:57

标签: c++

假设某个对象可以被其他对象引用(或引用)。目前我使用成员变量来记录其引用次数。引文计数用于确定是否可以删除对象。

class Cited
{
public:
    int m_citationCount;
};

我将变量公之于众。当引用该对象时,它会增加1.如果它被取消,则减少1.使变量公开似乎不合适。如果它只有一种类型的citer,我可以使citer类型成为朋友。但是,可能存在各种各样的含量。有没有更好的主意呢?

更多信息:这些对象是树结构中的项目或节点。一些节点可以引用其他节点。例如,一个节点被称为空气,它代表具有密度等特性的材料空气。称为背景的节点可以引用空中节点以显示背景是空气。树上的操作是可撤消的。如果用户删除后台节点,则只会将其推入撤消堆栈。它并没有真正删除。

2 个答案:

答案 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类的复制构造函数和赋值运算符)。