Когда мне нужно будет реализовать operator []? - PullRequest
1 голос
/ 30 августа 2011

с учетом следующей функции шаблона:

template <class T>
void DoSomething(T &obj1, T &obj2)
{
      if(obj1 > obj2)
        cout<<"obj1 bigger: "<<obj1;
      else if(obj1 == obj2)
        cout<<"equal";
      else cout<<"obj2 bigger: "<<obj2;

      T tmp(3);
      T array[2];
      array[0]=obj1;
      array[1]=obj2;
}

Мне нужно определить класс с именем MyClass (только объявления, т.е. только файл .h), который мог бы работать с этой функцией шаблона. Я определил следующие объявления:

class MyClass
{
public:
    MyClass();    // default ctor
    MyClass(int x);  // for ctor with one argument
    bool operator ==(const MyClass& myclass) const;
    bool operator >(const MyClass& myclass) const;
    friend ostream& operator<<(ostream &out,const MyClass& myclass);  // output operator

};

Я не понимаю, почему нет необходимости определять оператор [] для строк:

array[0]=obj1; array[1]=obj2; 

? Когда мне нужно определить оператор []? спасибо, Рон

Ответы [ 4 ]

6 голосов
/ 30 августа 2011

Вы объявили массив для вашего типа:

T array[2];

Но вы говорите о реализации оператора [] для T, который является совершенно другой концепцией.

Если вам нужно

T t;
t[1] = blah

Тогда вам нужно реализовать оператор []

2 голосов
/ 30 августа 2011

Потому что

T array[2];

Это не объект T, это массив T. Так что

array[0];

Индексирует массив, а не один из ваших объектов, поэтому вам не нужен оператор [].

1 голос
/ 30 августа 2011

Предполагая, что вы вызываете DoSomething с парой MyClass объектов, вы объявили array как обычный массив MyClass объектов. Вам не нужен оператор [] для MyClass, потому что array не является экземпляром MyClass; это просто массив.

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

0 голосов
/ 30 августа 2011

Если бы ваш класс был реализацией динамического массива, например, вы бы хотели получить доступ к (одному) объекту , как если бы это был массив - вы перегрузили оператор [].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...