我有一个类,我用它来创建链接对象集。以这样的方式执行“链接”:给定集合的每个对象的指针link
指向该类的一个相同对象(从现在开始将其称为“头部”)。因此,当访问集合的对象时,它将依次提供对头部的访问,因此,访问头部中包含的data_
(一种链接列表,但所有对象都链接到一个单个对象,而不是链接到列表的下一个对象。)
该课程如下:
template <typename T> class Myclass;
template <typename T>
class Myclass
{
Myclass<T>* link;
shared_ptr<T> data_;
int count_;
Myclass<T>* rep()
{
if(link==0x00) return this;
else
{
Myclass* ret = link->rep();
return link = ret;
}
}
public:
Myclass()
: link(0x00)
, count_(1)
{}
explicit Myclass(const shared_ptr<T>& data)
: link(0x00)
, data_(data)
, count_(1)
{}
(...more functions)
void add(Myclass<T>& rv)
{
if(*this == rv) return;
rv.data() = shared_ptr<T>();
rep()->count_ += rv.empty() ? 1 : rv.count();
rv.count_ = 0;
rv.rep()->link = rep();
}
shared_ptr<T>& data()
{
return rep()->data_;
}
}
当构造函数Myclass
调用explicit Myclass(const shared_ptr<T>& data)
的对象时,会创建“head”,data_
填充const shared_ptr<T>& data
。方法add()
将Myclass
的对象添加到集合中,方法是将其链接到集合的头部。 “链接”实际上由rep()
完成,您可以在代码中看到。该类的任何公共函数都通过rep()
完成其内容,就像在data()
中一样。因此,我可以从集合中的任何对象访问data_
。
问题是,当在代码中某处处理一组Myclass
的一个对象时,我可能需要分解该集合。为了打破设置,我认为该组的所有对象都不会从头部开始(即,变量link
不再指向头部)并且头部的data_
也是释放(所以它不再是头脑)。这里的挫折是我只能访问我正在处理的对象和头部(通过rep()
)。
当我只能访问该组中的一个对象时,如何进行此分解?
我想出的唯一想法是在类中创建另一个变量,即指针Myclass<T>*
的向量。每次将一个对象添加到一个集合中时,头部的向量会增加一个指向这个全新对象的指针。因此,当我想“解散”一个集合时,我只需要通过这些指针将每个对象的变量link
修复为0x00
。但是,我很确定它必须是其他更优雅和优化的方法。
任何想法都会受到欢迎。希望我已经清楚地解释了我的问题。
答案 0 :(得分:1)
如果我完全理解你的问题,你应该能够用智能指针(比如C ++ 11的shared_ptr和相关类)做到最安全和最简单。