簡體   English   中英

如何用const實參初始化非const成員變量?

[英]How to initialize non-const member variables with const actual parameter?

當我使用參數的給定數據類型初始化構造函數時,我發現“無法將 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;
}

我應該怎么做才能解決這個問題? 如果可能的話,給我一個正確的例子。 在此先感謝並為我的無知道歉。

const char * 通常是預定義的 static 編譯字符串,不能更改,因為它們被鎖定在源代碼中,或者它們來自一些不可變的源。 這部分是為什么將它們標記為 const 以防止人們試圖更改它們的原因。

解決這個問題最簡單的方法是把 const char * 復制到堆上,然后它就不再是常量了。

例如:

#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 現在在堆上,因此在析構函數中,您需要釋放此數據,否則將出現 memory 泄漏。

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

您還需要在 TString() 構造函數中也設置 m_pData=NULL。

這將適用於字符串,但如果它是二進制數據,即沒有終止符,則使用 malloc 分配數據並使用 memcpy,例如:

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

或者一些這樣的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM