2015-06-24 3 views
3

я следующий код:оператор [] перегружать принять символ * для индекса

class IList{ 
public: 
    virtual const Pair *get(const char *key) const = 0; 

    inline const Pair *operator[](const char *key) const; 
}; 

inline const Pair *IROList::operator[](const char *key) const{ 
    return get(key); 
} 

код компилируется нормально, но когда я пытаюсь использовать:

IList *list = (IList *) SomeFactory(); 
Pair *p; 
p = list["3 city"]; 

я получил:

test_list.cc:47:19: error: invalid types ‘IList*[const char [7]]’ for array subscript 
    p = list["3 city"]; 
       ^

Я могу понять, что индекс массива - int или char, , но затем как std :: map делает char */strings?

+1

Каков тип 'list'? – NathanOliver

+0

точно. list - это указатель на класс – Nick

+0

@Nick И вы пытаетесь индексировать указатель, а не перегружать оператор. – molbdnilo

ответ

6

Если ваш list также является указателем, вы не можете использовать оператор [] так, как вы это делали. Это потому, что list["3 city"] эквивалентно list.operator[]("3 city"). Если вы указали указатель, вам нужно будет использовать list->operator[]("3 city") или - что более читаемо - (*list)["3 city"]. Конечно, вы также можете сделать свой список ссылкой и использовать в обычном режиме:

auto& listRef = *list; 
p = listRef["3 city"]; 
+0

вот почему все эти дни используют & вместо * – Nick

+0

и потому, что * в C++ обычно плохо и некрасиво;) – PiotrSliwa

+0

хорошо я не делал C++ в течение 5-6 лет, и теперь я нашел, что C++ похож на плохую Java. Это больше похоже на новый вопрос, но люди делают 'Book * b = new Book();' или 'Book & rb = * new Book();' Если я делаю второй, я должен «удалить &rb;'? – Nick

3

Кажется, что это указатель на объект IList. Поэтому вы должны попробовать: p = (* list) ["3 city"];

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