Квалификатор const
в методе, который должен защищать элемент данных от перезаписи по ошибке.Если у вас есть элемент данных, который является указателем, тогда защищается только указатель, а указанное значение - нет.Это недостаток в дизайне C ++ или есть что-то фундаментальное, чему он служит?
Вот код, который демонстрирует ситуацию.Прежде чем сообщать о не относящихся к делу ошибках и проблемах стиля, имейте в виду, что его единственная цель - продемонстрировать вышеуказанную ситуацию и быть краткой и понятной в этом.
#include <cstdio>
#include <cstdlib>
#include <cstring>
class Cat
{
public:
Cat(char const *name)
: _name(strdup(name))
{ }
~Cat(){ free(_name); }
void SetName(char const *name)
{
free(_name);
_name = strdup(name);
}
char const* GetName() const
{
_name[0] = 'P';
return _name;
}
private:
char *_name;
};
int main()
{
Cat c("lost+found");
c.SetName("Molly");
printf("%s\n",c.GetName());
return 0;
}
Компиляция прошла без предупреждений и ошибок с помощью следующей команды:
g++ -W -Wall -Wextra -pedantic -Os pmc.cpp -o pmc
Вывод полученной программы составил Polly
.
ОБНОВЛЕНИЕ Использование педантичного char const *
вместо традиционного const char *