2013-04-03 5 views
2

Я пытаюсь реализовать классы List и Iterator (наша домашняя работа, мы должны реализовать собственный список в стиле stl). У меня есть вопрос о операторе ++. В моей реализации, ++ не возвращает ничего:Правильный тип возвращаемого значения для оператора ++

void operator++(); 

Но мой друг реализован так:

Iterator& operator++(); 

Я проверил их обоих, и, кажется, как они работают. Но я считаю, что должна быть какая-то большая разница. Но я новичок на языке C++. Поэтому я не вижу этого. Может ли кто-нибудь помочь мне?

+0

Уверен, что это не C++? – alex

+0

ах. это C++ ^^. Я всегда рассматриваю c и C++ как то же самое ^^. Извините, что я настоящий новичок – nomnom

+1

У вас должен быть объект, возвращающий ссылку на себя. Например, вы можете сделать 'myArray [i ++]', например. – Dave

ответ

3

Общее соглашение здесь заключается в том, что перегруженные операторы должны напоминать обычные. Например, вы можете:

int x = 5; 
int y = ++x; 

Так что ваши итераторы действительно должны быть доступны в аналогичном контексте: версия

Iterator i = smth.begin(); 
Iterator j = ++i; 

Вашего друга это позволяет.

Там также старая C шутка:

++i = 0; 

Так что да, ваш operator ++() должен возвращать *this как Lvalue, чтобы такого рода вещи, так что тип возвращаемого значения Iterator& и не Iterator или const Iterator&.

1

Разница заключается в том, что версию вашего друга можно назвать в формах, как

// loop that skips the first element 
while (++it != end) 
    // perform operation 

где it некоторый итератор. Функции библиотеки и код клиента могут зависеть от этого, поэтому всегда возвращайте *this из перегруженного operator++. Все стандартные итераторы библиотек работают таким образом, а также делают указатели, на которых они моделируются.

1

Разница в том, что его оператор может использоваться так, как если бы итератор был указателем, а ваш не может. С указателями, вы можете сделать это:

char *p1, *p2; 
... 
p1 = ++p2; 

Для этого, чтобы работать с итераторами, оператор ++ должен возвращать значение до (или после) приращений, в зависимости от пре- или пост- положения оператора. Ваша реализация не делает этого. Хотя это технически нормально, результирующий оператор не такой функциональный, поэтому рекомендуется изменить свою реализацию, чтобы вернуть значение.

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