Перегрузка оператора []
Поэтому я попытался перегрузить оператор [], и он просто не работает. Я создал этот класс:
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;
какие-либо предложения?
3 ответа
String* str = new String("example");
cout << str[2] << endl;
Вот str
это указатель, так str[2]
не вызывает вашего оператора, но обращается к третьему объекту в памяти с адреса str
который не существует, таким образом, у вас есть неопределенное поведение.
Что вам нужно это:
cout << (*str)[2] << endl;
str
это указатель на String
так что в str[2]
компилятор лечит str
как массив.
Вам нужно получить доступ к объекту - так что почтите указатель. т.е. (*str)[2]
В первом примере str
это указатель на String
объект. Вам нужно сначала разыменовать его, а затем вызвать оператора.