2013-03-11 52 views
2

我有一個類,像這樣:不能分配給該

class Node { 
    // data 
    Node* next; 
    void operator++(int); 
}; 

當我定義遞增運算符,就像這樣:

void Node::operator++(int) { 
    this = this->next; 
} 

我得到的錯誤Expression is not assignablethis = this->next;

這是怎麼回事?我如何獲得this指向next

+0

'this'只能用作指向當前實例的指針。指派給「this」是沒有意義的。你爲什麼想這麼做 ? – Tuxdude 2013-03-11 07:20:45

+0

也許你可以改成'Node * Node :: operator ++(int){return this-> next; }' – Jichao 2013-03-11 07:22:34

+1

順便說一句,後綴'operator ++'返回void是很奇怪的。這勢必會混淆用戶。人們會期望它返回一個「節點」。 – juanchopanza 2013-03-11 07:25:42

回答

2

甚至不要嘗試。它不會工作,如果你能使它工作,反正它會是一件壞事。

從外觀看,你的節點就像一個鏈表。如果是這樣的話,那麼你通常想的是一樣的東西:

template <class T> 
class linked_list { 

    class node { 
     node *next; 
     T data; 
    }; 

    node *head; 
public: 
    class iterator { 
     node *n; 
    public: 
     iterator(node *n=NULL) : n(n) {} 

     iterator &operator++() { 
      n=n->next; 
      return *this; 
     } 
     bool operator!=(iterator const &other) const { 
      return n != other.n; 
     } 
     // ...   
    }; 

    iterator begin() { return iterator(n); } 
    iterator end() { return iterator(); } 
}; 
+0

因此,基本上使用'linked_list :: iterator'的'++'運算符來遍歷列表,而不是試圖給'linked_list :: node'它自己的'++'運算符? – anthropomorphic 2013-03-11 08:11:04

+1

我懷疑'operator ++'是否正確,應該返回* this;'。 – 2013-03-11 08:23:19

+0

@MichaelDorst:正確。增加鏈表的節點根本沒有多少意義。遞增迭代器的確如此。 – 2013-03-11 13:17:31

0

你不能那樣做。即使通過一些骯髒的竅門你改變this,改變將不會傳播給調用者。 this是一種隱藏的方法論。

0

這是不可能的。在呼叫方這樣做,像下面這樣:

current_node = current_node->next; 
0

你似乎很困惑,你在這裏試圖做什麼。您有一個node類,它表示列表中的一個節點。通常,還會有一個iterator類,它代表您當前位於列表中的位置。在我看來,您試圖使用++迭代到列表中的下一項,但要做到這一點,您需要將迭代器作爲它自己的類。

一般來說是沒有意義分配給this指針 - this指的是當前對象的情況下,你不能僅僅通過設置this指針更改背景。

我希望這會對你有所幫助。

-1

隱藏參數'this'與'const'限定符一起傳遞。因此它不能改變。 Hidden this

1

這是不能改變的。它是不變的。

0

你剛剛發現STL有迭代器爲什麼。一個迭代器持有一個指向節點的指針作爲它自己的成員,或者在某些情況下它是一個指針。它也可以修改它的成員變量。也許嘗試類似:

class Iterator { 
    Node* node; 
public: 
    Iterator(Node* n) 
     : node(n) 
    {} 

    Iterator& operator++() 
    { 
     node = node->next; 
     return *this; 
    } 

    Iterator operator++(int) 
    { 
     Node* current = node; 
     node = node->next; 
     return Iterator(current); 
    } 

    Node& operator*() 
    { 
     return *node; 
    } 

    const Node& operator*() const; // etc... 
}; 
+0

如果解除引用運算符返回'node-> data',它不會更有意義嗎? (假設'data'是我們正在迭代的成員的名稱),還是更好地提供對節點的訪問而不僅僅是值? – anthropomorphic 2013-03-11 08:25:55

+0

是的,沒有。這與所有其他迭代器的工作方式都很不一致。它起初可能看起來很方便,但它有點太「魔力」,破壞了清晰的分層。如果您將'Node'轉換爲您的容器的內部類並且'Iterator'成爲該設計的一部分,那麼您當然可以直接返回對數據的引用。總的來說,我建議你閱讀更多關於STL中的容器和迭代器的內容,因爲這裏的主題對於簡單的Q/A風格來說太寬泛了。 – 2013-03-11 08:38:09

1

按照C++標準this指針是prvalue表達(見[class.this]),但是賦值運算符需要一個左值爲其左操作數(見[expr.ass])。

相關問題