Перегрузка оператора []

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

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 объект. Вам нужно сначала разыменовать его, а затем вызвать оператора.

Другие вопросы по тегам