struct reference和operator =

时间:2010-10-07 12:24:41

标签: c++

我有一个这样的课程:

template <class T>
    class bag
    {
    private:    
        typedef struct{T item; unsigned int count;} body;
        typedef struct _node{_node* prev; body _body; _node* next;}* node;  
        struct iterator{
            enum exception{NOTDEFINED, OUTOFLIST};
            body operator*();

            explicit iterator();
            explicit iterator(const iterator&);
            iterator& operator=(const iterator&);
            iterator& operator++(int);
            iterator& operator--(int);
            bool operator==(const iterator&) const;
            bool operator!() const;     
        private:
            node current;

            friend class bag;
        };
        node head;
        node foot;

        iterator _begin;
        iterator _end;

        /* ... */

    public: /* ... */
        bag();
        const iterator& begin;
        const iterator& end;        
    };

在bag()中,我必须将引用开始设置为_begin,并结束_end。

begin = _begin;
end = _end;

但我认为这一行

begin = _begin;

调用bag :: iterator :: operator =()函数。

我怎么能避免这种情况?

4 个答案:

答案 0 :(得分:3)

无法分配参考,仅初始化。因此,您需要在构造函数的初始化列表中初始化它们:

bag() : begin(_begin), end(_end) {}

然而,使用访问器函数而不是公共引用更常规(并且还减少了类大小):

const iterator& begin() {return _begin;}
const iterator& end() {return _end;}

答案 1 :(得分:1)

使用初始化列表:

bag::bag() : begin(begin_), end(end_)
{
}

答案 2 :(得分:0)

正如迈克所说,你必须在你声明它的地方初始化一个参考,之后你不能改变它。初始化列表是最惯用的解决方案,如果您不必在构造对象后修改引用,但是如果您预见到必须更改它们,那么仍然有很好的旧指针:

public: /* ... */ 
        bag(); 
        iterator *begin; 
        iterator *end; 

答案 3 :(得分:0)

包含引用成员的类基本上变得无法分配(因为无法重新引用引用)。

看起来你的Bag正在复制几个成员中的相同数据(保持重复值同步的额外负担)。

相反,您可以执行标准库的操作:按begin()end()方法的值创建并返回迭代器。

template <class T>
class bag
{
    struct node { /*...*/ }

    /* ... */
    node* head; //why would you want to typedef away that these are pointers?
    node* tail;
public:
    class iterator {
        iterator(node*);
        /* ... */
    };
    iterator begin() { return iterator(head); }
    iterator end() { return iterator(tail); }
    //also you might need const_iterators
};