簡體   English   中英

結構參考和運算符=

[英]struct reference and operator=

我有這樣的課:

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 =()函數。

我如何避免這種情況?

引用無法分配,只能初始化。 因此,您將需要在構造函數的初始化列表中對其進行初始化:

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

但是,使用訪問器函數而不是公共引用來獲取它們是更常規的做法(並且還減少了類的大小):

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

使用初始化列表:

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

正如Mike所說,您必須在聲明它的地方初始化一個引用,此后您將無法更改它。 如果在構造對象后不必修改引用,則初始化程序列表是最慣用的解決方案,但是在您預見到必須更改它們的情況下,仍然有很好的舊指針:

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

包含引用成員的類實際上變得不可分配(因為無法重新引用)。

您的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
};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM