0

我有一个用于创建链接对象集的类。“链接”是以这样一种方式执行的,即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. 但是,我很确定它必须是其他更优雅和优化的方法。

任何想法都会受到欢迎。希望我已经足够清楚地解释了我的问题。

4

1 回答 1

1

如果我完全理解您的问题,您应该能够使用智能指针(如 C++11 的 shared_ptr 和相关类)最安全、最简单地执行此操作。

于 2013-05-30T10:09:59.893 回答