我有一个用于创建链接对象集的类。“链接”是以这样一种方式执行的,即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>*
。每次将一个对象添加到一个集合中,头部的向量都会增加一个指向这个全新对象的指针。因此,当我想“解散”一个集合时,我只需通过这些指针将link
每个对象的变量修复为0x00
. 但是,我很确定它必须是其他更优雅和优化的方法。
任何想法都会受到欢迎。希望我已经足够清楚地解释了我的问题。