如何计算对象的引文数?

How to count an object's citation number?

本文关键字:文数 对象 何计算 计算      更新时间:2023-10-16

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

class Cited
{
public:
    int m_citationCount;
};

我将变量设为公共。当对象被引用时,它增加1。如果它没有被引用,它就减少1。将变量公开似乎不太合适。如果它只有一种类型的水,我可以让水类型的朋友。然而,可能有各种各样的城市。有更好的办法吗?

更多信息:这些对象是树结构中的项或节点。一些节点可能引用其他节点。例如,一个节点被称为空气,它代表具有密度等属性的物质空气。称为background的节点可以引用air节点来显示背景是air。对树的操作是可撤销的。如果用户删除后台节点,它只是被推入撤消堆栈。

为自己省省吧,直接使用c++的shared_ptr模板吧。


好的,既然问题已经改变了,答案也需要改变。

基本上,你只需要使用一些策略:

使用shared_ptr链接

任何时候您需要跟踪一个节点,使用shared_ptr<Node>,其中Node是您的节点类。例如,如果Node需要引用另一个Node,那么它的有一个 shared_ptr<Node>来做这件事。例如,在你的例子中,你可以有:

类Material: public Node {//这里的材质属性

};

class Background: public Node {//这里的材质属性void SetMaterial(shared_ptr mat);

};

void set_stage() {shared_ptr air = new Material(/构造函数参数/);shared_ptr skyBG = new Background(/构造函数参数/);skyBG -> SetMaterial(空气);}

<标题>撤销支持h1> 获得撤销支持,请记住,撤销堆栈通常是一个操作堆栈,每个操作包含足够的信息来确定所做的操作(因此可以撤销)。如果一个动作涉及到一个节点,那么它应该(像其他所有东西一样)使用shared_ptr<Node>来引用它。

您可以使用带有自定义删除器的shared_ptr制定一个方案,该方案将在计数降为0时执行您需要的任何操作。

或者你可以手动滚动一些东西。至少,让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返回,将保留一个指向引用对象的指针,并将在其析构函数中调用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类的复制构造函数和赋值操作符)。