2017-12-02 271 views
0
template <class TYPE> 
class DList 
{ 
    //Declaring private members 
    private: 
    unsigned int m_nodeCount; 
    Node<TYPE>* m_head; 
    Node<TYPE>* m_tail; 

    public: 
    DList(); 
    DList(DList<TYPE>&); 
    ~DList(); 
    unsigned int getSize(); 
    void print(); 
    bool isEmpty() const; 
    void insert(TYPE data); 
    void remove(TYPE data); 
    void clear(); 
    Node<TYPE>* getHead(); 
    ... 
    TYPE operator[](int); //i need this operator to both act as mutator and accessor 
}; 

我需要編寫一個模板功能,將做如下處理:C++ []索引運算符重載作爲accessor和mutator

// Test [] operator - reading and modifying data 
cout << "L2[1] = " << list2[1] << endl; 
list2[1] = 12; 
cout << "L2[1] = " << list2[1] << endl; 
cout << "L2: " << list2 << endl; 

我的代碼着工作與

list2[1] = 12; 

我得到錯誤C2106:'=':左操作數必須是l值錯誤。 我想[]操作才能夠讓列表2的第一個索引節點值12

我的代碼:

template<class TYPE> 

    TYPE DList<TYPE>::operator [](int index) 
    { 
     int count = 0; 
     Node<TYPE>*headcopy = this->getHead(); 
     while(headcopy!=nullptr && count!=index) 
     { 
      headcopy=headcopy->getNext(); 
     } 

     return headcopy->getData(); 
    } 
+0

操作'[]'通常有兩個重載,沒有之一。你需要實現兩者。 [見示例](http://en.cppreference.com/w/cpp/container/vector/operator_at) – PaulMcKenzie

+0

此外,如果'DList '作爲'const'傳遞,並且您試圖在任何方面使用'[]'。這就是爲什麼你需要第二次過載。 – PaulMcKenzie

+0

你能告訴我這個例子嗎? –

回答

1

我的代碼斜面工作

list2[1] = 12; 

我得到錯誤C2106:'=':左操作數必須是l值錯誤。我想 []操作才能夠讓列表2的第一個索引節點值12

在C++中,我們有所謂的Value Categories。您應該通過參考使操作員返回。

TYPE operator[](int); 

到:因此,你的宣言,從改變

TYPE& operator[](int); 

我假設headcopy->getData();同樣返回到一個非本地變量的引用。


由於PaulMcKenzie注意,你同樣需要一個有constthis,又名const成員函數重載工作過載。因此,我們有:

TYPE& operator[](int); 
const TYPE& operator[](int) const; 

What is meant with "const" at end of function declaration?Meaning of "const" last in a C++ method declaration?

+0

如果'DList'作爲'const'傳遞給一個函數,'[]'仍然無法工作。 – PaulMcKenzie

+0

所以除了TYPE&operator [](int);這個實現,我需要第二個實現我的[]運算符爲list2 [1] = 12;工作? –

+0

@ZhhMenzo,'const' *成員函數*重載是需要使這個操作符從'const'對象調用時工作。看到我的回答中的鏈接 – WhiZTiM