2016-01-23 1 views
1

Так что я попытался перегрузить оператор из [], и он просто не работает. Я создал этот класс:перегрузка оператора из []

class String 
{ 
private: 
    char* str; 
public: 
    String(char* str) // constructor 
    { 
     this->str = str; 
    } 
    char* Val() // returns value of this.str 
    { 
     return this->str; 
     } 
char & operator [](int index) { return this->str[index]; } 
}; 

и я пытался использовать его как так

String* str = new String("example"); 
cout << str[2] << endl; 

ожидаемый результат был отпечаток буквы «а», но он не будет работать .. он работает, хотя когда я создаю такой объект:

String str("example"); 
cout << str[2] << endl; 

любые предложения?

+0

'(* str) [2]' должен работать, поэтому должен 'str-> operator [] (2)' –

+1

Также обратите внимание, что ваш класс String не имеет копии строки, которую вы передаете ей конструктор. –

ответ

1
String* str = new String("example"); 
cout << str[2] << endl; 

str здесь является указатель, так str[2] не звонит оператору, но доступ к третьему объекту в памяти с адреса str, который не существует, таким образом, у вас есть неопределенное поведение.

Что вам нужно:

cout << (*str)[2] << endl; 
+0

Теперь он работает! благодаря! Я попытался адресовать его как * str [2], но не думал об использовании скобок. – ben

+0

это из-за [приоритета оператора] (http://en.cppreference.com/w/cpp/language/operator_precedence) – bolov

1

str является указателем на String, поэтому в str[2] компилятор обрабатывает str как массив.

Вам необходимо получить доступ к объекту - так уважайте указатель. то есть (*str)[2]

1

В первом примере str является указателем на объект String. Вам нужно сначала разыменовать его, а затем вызвать оператора.

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

  • Нет связанных вопросов^_^