Как инициализировать неконстантные переменные-члены с константным фактическим параметром? - PullRequest
0 голосов
/ 14 апреля 2020

Когда я инициализирую конструктор с заданным типом данных параметра, я нахожу, что это неправильно с объяснением, что «значения const char * не могут быть назначены объектам char *».

class TString
{
private:
    char* m_pData;
    int  m_nLength;
public:
    TString();
    TString(const  char* pStr);
    ······
}
TString::TString(const  char* pStr) {
    this->m_pData = pStr;
}

Что я должен сделать, чтобы решить эту проблему? Если возможно, дай мне правильный пример. Заранее спасибо и прошу прощения за мое невежество.

1 Ответ

0 голосов
/ 14 апреля 2020

Const char *, как правило, являются предопределенными скомпилированными строками c, которые нельзя изменить, поскольку они заблокированы в исходном коде или получены из какого-то неизменного источника. Это отчасти потому, что они помечены как const, чтобы люди не пытались их изменить.

Самое простое решение этой проблемы - взять константный символ * и скопировать его в кучу, тогда он больше не будет постоянным.

Например:

#include <string.h> // for strdup
...
TString::TString(const  char* pStr) {
    m_pData = strdup(pStr); // this will malloc and copy the string accepting const char * as input.
}

Одна вещь, которую вам нужно учитывать, теперь m_pData находится в куче, поэтому в деструкторе вы захотите освободить эти данные, иначе у вас будет утечка памяти.

TString::~TString(){
  free(m_pData);
}

Вы также захотите, чтобы в конструкторе TString () было также установлено значение m_pData = NULL.

Это будет работать со строками, но если это двоичные данные, т. Е. Терминатор не выделяет данные, используя mallo c и использует memcpy, например:

m_pData=(char *)malloc(m_nlength*sizeof(char));
memcpy(m_pData,pStr,m_nlength);

или некоторые такие.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...