如何计算对象的引文数?
How to count an object's citation number?
假设一个对象可以被其他对象引用(或引用)。目前我使用一个成员变量来记录它的引用数。引用计数用于确定对象是否可以删除。
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类的复制构造函数和赋值操作符)。
- 将对象数组的引用传递给函数
- C++使用整数的压缩数组初始化对象
- 将包含C样式数组的对象初始化为成员变量(C++)
- 如何使用Visual Studio 2017在C++中为参数化对象数组使用唯一指针
- 在c++中尝试对对象数组进行排序时,出现std:bad_alloc错误
- 回文数在 1 到 10000 之间
- Rapidjson将密钥值从一个文档对象分配到另一个文档对象
- MFC编辑控制消息处理访问文档对象
- C - 空数对象的初始化发送不良访问错误
- C 中的回文数程序
- rapidjson:如何将文档对象拆分为较小的文档对象
- 检查子数组是否为带指针的回文数组
- C++中的回文数
- 由两个三位数的乘积构成的所有回文数
- 使用检查功能查找给定范围内的所有回文数
- 找到下一个最大的回文数
- 最接近的回文数
- 求两个3位数乘积的最大回文数
- 最大回文数3位
- 需要算法来找到第n个回文数