我有一个类,我用它来创建一组链接对象。"链接"是以这样一种方式执行的,即给定集合的每个对象的指针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)
调用时,创建一个"头",data_
被const shared_ptr<T>& data
填充。方法add()
通过将Myclass
的对象链接到集合的头部,将其添加到集合中。"链接"实际上是由rep()
完成的,正如您在代码中看到的那样。类的任何公共函数都通过rep()
完成它的工作,就像data()
一样。因此,我可以从集合的任何对象访问data_
。
问题是,当在代码的某个地方处理Myclass
集合中的一个对象时,我可能需要分解该集合。对我来说,分解集合意味着该集合的所有对象都不喜欢头部(即,变量link
不再指向头部),并且头部的data_
被释放(因此它不再是头部)。这里的挫折是,我只能访问我正在处理的对象和头部(通过rep()
)。
当我只能访问集合中的一个对象时,我如何执行这个分解?
我唯一的想法是在类中创建另一个变量,指针的向量Myclass<T>*
。每当一个对象被添加到set中时,头部的向量就会增加一个指向这个新对象的指针。所以,当我想要"溶解"一个集合时,我只需要通过这些指针,将每个对象的变量link
固定为0x00
。然而,我很确定一定有其他更优雅和优化的方式来做到这一点。
任何想法都会非常受欢迎。希望我已经足够清楚地解释了我的问题
如果我完全理解你的问题,你应该能够用智能指针(如c++ 11的shared_ptr和相关类)最安全,最容易做到这一点。