Классы C++ получают значение с помощью указателей и strcpy

Я пытаюсь понять С++. Может ли кто-нибудь объяснить, что именно делает этот код, я понял, что это какой-то тип установки и получения в Java, но я не уверен.

Comm::Comm(const char* id)
{
strcpy(this->id, id);
}


char* Comm::getId()
{
   return id;
}

person user3126119    schedule 05.01.2014    source источник
comment
Обычный плохой код (если ваш пример показывает все)   -  person    schedule 06.01.2014
comment
Это не сеттер, это конструктор   -  person prajmus    schedule 06.01.2014
comment
Я настоятельно рекомендую вам приобрести какую-нибудь книгу, которая научит вас основам C++. Я должен сказать, что «Начало C++ через игровое программирование» не так уж и плохо.   -  person Tymoteusz Paul    schedule 06.01.2014
comment
Этот вопрос кажется не по теме, потому что он лучше подходит для чата, дискуссионного форума или сеанса наставничества один на один.   -  person Lightness Races in Orbit    schedule 06.01.2014
comment
@ user3126119: Как ты что делаешь?   -  person Lightness Races in Orbit    schedule 06.01.2014
comment
Он небезопасно копирует строку с завершающим нулем в то, что я могу только предположить, является массивом символов в классе Comm. Поскольку нет проверки/усечения границ, это ужасно. strncpy (...) заставит меня меньше съеживаться.   -  person Andon M. Coleman    schedule 06.01.2014


Ответы (1)


Что делает этот код?

Он обжигает глаза детей.

Здесь предполагается, что класс Comm имеет переменную-член типа char* или char[N]. "Сеттера" как такового не существует, но конструктор Comm пытается скопировать свои входные данные в эту переменную-член. Функция getId является геттером для этой переменной-члена.

В зависимости от остального кода это может быть полностью ошибочным из-за отсутствия выделения памяти, отсутствия освобождения памяти и отсутствия семантики копирования. В лучшем члене является массивом, и тогда отсутствие проверки диапазона в вызове strcpy представляет серьезную угрозу безопасности.

Класс был бы намного лучше переработан с использованием std::string.

Я бы не рекомендовал вам изучать этот фрагмент кода.

Вместо этого изучите хорошую книгу.

person Lightness Races in Orbit    schedule 05.01.2014
comment
Этот ответ тоже бесполезен - person ; 06.01.2014
comment
@DieterLücking: Спасибо за ваш зрелый и продуктивный вклад. - person Lightness Races in Orbit; 06.01.2014
comment
Спасибо за хорошо информированное «Это жжёт глаза детям» - person ; 06.01.2014
comment
@DieterLücking: Знаете, я написал другие слова... - person Lightness Races in Orbit; 06.01.2014
comment
Насколько полезно выражение «Я бы не рекомендовал вам учиться на этом фрагменте кода»? - person ; 06.01.2014
comment
@DieterLücking: Чем это не полезно? ОП может не знать, что это потенциально очень плохой код. Чем это ему не поможет? Я бесплатно делюсь своим опытом. Это полезно. Ваше нытье по моему ответу без какой-либо конструктивной критики что бы то ни было бесполезно. Пожалуйста, прекратите и не стесняйтесь написать свой собственный ответ, если вы думаете, что можете сделать намного лучше! - person Lightness Races in Orbit; 06.01.2014