2016-10-30 11 views
-4

私は、演算子[]と演算子=のアライメントに問題があります。 LinkedList LinkedList :: operator =(const int & n)関数を書くのはわかりません。私が会ったオペレータのようには見えません。 可能な限りコードの性質を理解してください。ありがとうございました!operator []とoperator =?を使用する方法

ファイルの.h

class LinkedList 
    { 
    private: 
     Node* pHead; 
     Node* pTail; 
     int curN; 
    public: 
     int& operator[](const int& i); 
     LinkedList operator = (const int& n);// 
    }; 

ファイル.CPP

int& LinkedList::operator[](const int& i) 
    { 
     int tmp; 
     if (i < 0) 
      tmp = 0; 
     else if (i > this->curN) 
      tmp = this->curN - 1; 
     else 
      tmp = i; 

     int count = 0; 
     Node* pNode = this->pHead; 
     while (count < tmp) 
     { 
      count++; 
      pNode = pNode->pNext; 
     } 
     return pNode->_data; 
    } 

    LinkedList LinkedList::operator=(const int& n) 
    { 
     //Problem here 
    } 

およびファイルmain.cppに

int main() 
    { 
     srand(1234); 
     LinkedList l; 
     l[-1] = 9000; 
     l[4] = 2000; 
     l[100] = 10000; 
     cout << l << endl; 
    } 
+2

リンクリストにある 'operator []'のオーバーロードは素晴らしい設計思想ではありません。ほとんどの人は、 'operator'は何かに一定の時間アクセスを提供すると考えています。リンクされたリストの場合、それは線形時間アクセスを提供しています。 – Sean

+0

演算子 '='は完全に独立しています。あなたのコードはそれを使用せず、そのまま動作します。 – dasblinkenlight

+0

それは動作するはずですか? 'operator []' **は常に**有効なリンクを見つけてそのデータを返しますか? – StoryTeller

答えて

0
l[-1] = 9000; 
    l[4] = 2000; 
    l[100] = 10000; 

LinkedList::operator[](const int& i)がintへの参照を返しますので、LinkedList::operator=(const int& n)は、呼び出されません。

あなたがしたいことは、あなたのLinkedList::operator[](const int& i)にノードを返すことです、あなた自身のoperator=を定義してください。

Node& LinkedList::operator[](const int& i) 
    { 
     int tmp; 
     if (i < 0) 
      tmp = 0; 
     else if (i > this->curN) 
      tmp = this->curN - 1; 
     else 
      tmp = i; 

     int count = 0; 
     Node* pNode = this->pHead; 
     while (count < tmp) 
     { 
      count++; 
      pNode = pNode->pNext; 
     } 
     return *pNode; 
    } 

///Your node class 
    class Node 
    { 
     public: 
      int _data; 
      Node& operator=(const int data) 
      { 
       _data = data; 
       return *this; 
      } 
    } 

編集:
メモリリークを回避するために、後で削除することができ、どこがどこかPNODEを置いていることを確認します。

+0

私は彼がそれをしたいとは思わない。彼はどのようにしてノードの価値を引き出すことができますか?私はNodeクラスの目的はLinkedListクラスの中にカプセル化されていると思う – Hugal31

+0

@ Hugal31カプセル化されたデータは、それが読み書きできないことを意味しません。 –

+0

はい、Mr.Duyのソリューションはかなり良いと思います。彼はただの運営者の目的を理解していません。 – Hugal31

0

operator=はあなたのオブジェクト用であり、そのコンテンツ用ではありません。この場合

は、LinkedList::operator=(const int& n)が呼び出されます。あなたの場合

LinkedList l; 
l = 5; 

、唯一LinkedList::operator[]が呼び出されます。

l[4] = 2000; 
+0

問題を理解しました。ありがとうございます! –

0

代入演算子は、リストクラスではなくNodeクラスにある必要があります。

ノードに割り当てています。リストクラスの代入演算子を呼び出すには、次のようにする必要があります:

l = LinkedList();コードのこの行で

(しかし、それはあなたが望むものではありません)

+1

問題を理解しました。ありがとうございます! –