class Text
{
public :   
       char& operator[](int pos) const   
       {return text[pos];}

        char* get() const
       {return text;}
private: 
     char* text = "hello";
};
int main() 
{
     Text a;
    char * x = &a[0];
    *x = 's';
    
    cout << a.get() << endl;

}

Я следил за книгой Скотта Мейерса «Эффективный C ++», там был класс, который мне пришлось реализовать самостоятельно, поэтому я попытался реализовать его самостоятельно, но эта программа продолжает давать сбой.

1
X caliber 14 Сен 2020 в 03:29

1 ответ

Лучший ответ

Эта строка:

char* text = "hello";

Недопустимый C ++, поскольку строковые литералы преобразуются в const char *. С правильными флагами командной строки ваш компилятор должен был вас предупредить об этом.

Далее, *x = 's'; приводит к неопределенному поведению, потому что x указывает на указанный строковый литерал. На практике вы получаете ошибку seg, поскольку пытаетесь писать в постоянную память.


Изменить: Вот фиксированная версия с использованием std::string:

#include <string>

class Text
{
public :   
     char& operator[](int pos) {return text[pos];}
     const char* get() const {return text.c_str ();}
private: 
     std::string text = "hello";
};

int main() 
{
    Text a;
    char * x = &a[0];
    *x = 's';
    
    std::cout << a.get() << std::endl;
}

Live демо

2
Paul Sanders 14 Сен 2020 в 01:17