2016-10-30 2 views
-4

У меня проблема с выравниванием оператора [] и оператора =. Я не могу понять, чтобы написать функцию LinkedList LinkedList :: operator = (const int & n) точно. это не похоже на какой-либо оператор =, с которым я познакомился. Пожалуйста, помогите мне разобраться в его природе (вместе с кодом как можно скорее). Спасибо большое!Как использовать оператор [] с оператором =?

файл .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& n) не будет называться, потому что LinkedList::operator[](const int& i) возвращает ссылку на междунар.

что вы хотите сделать, это вернуть узел на 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; 
      } 
    } 

Edit:
Убедитесь, что вы поместите 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

Теперь я понимаю проблему, спасибо! –

Смежные вопросы