如何用const实参初始化非const成员变量?
How to initialize non-const member variables with const actual parameter?
当我用参数的给定数据类型初始化构造函数时,我发现“const char* values cannot be assigned to char* entities”的解释出错了。
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 * 通常是预定义的静态编译字符串,不能更改,因为它们被锁定在源代码中,或者它们来自一些不可变的源。这部分是为什么将它们标记为 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 现在在堆上,因此在析构函数中,您需要释放此数据,否则会发生内存泄漏。
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);
或类似的。
当我用参数的给定数据类型初始化构造函数时,我发现“const char* values cannot be assigned to char* entities”的解释出错了。
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 * 通常是预定义的静态编译字符串,不能更改,因为它们被锁定在源代码中,或者它们来自一些不可变的源。这部分是为什么将它们标记为 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 现在在堆上,因此在析构函数中,您需要释放此数据,否则会发生内存泄漏。
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);
或类似的。