C++ C++;需要从常量字符串转换的解决方案
我有一个(小)问题。我打算在C++中编写一个小字符串类,它允许你用字符串一样的方式使用字符串。p> 我写了以下课程:C++ C++;需要从常量字符串转换的解决方案,c++,string,C++,String,我有一个(小)问题。我打算在C++中编写一个小字符串类,它允许你用字符串一样的方式使用字符串。p> 我写了以下课程: class STRING { private: char * data; int length; public: STRING(); STRING(char * data); //string(char[] data, int length); void setData(char * data); int Length(); char * t
class STRING
{
private:
char * data;
int length;
public:
STRING();
STRING(char * data);
//string(char[] data, int length);
void setData(char * data);
int Length();
char * toString();
STRING operator = (STRING data);
STRING operator = (char * data);
STRING operator = (char data);
STRING operator = (const string data);
STRING operator + (STRING data);
friend ostream& operator<<(ostream&os, const STRING& data);
void display();
};
编译器给我以下警告:警告:已弃用从字符串常量到“char*”的转换 [-Wwrite strings]test1=“TEST” 所以我试图以操作重载的形式得到一个解决方案。我试过这个:
STRING STRING::operator = (const string data)
{
char * tmp;
int laenge;
tmp = (char *) data
laenge = strlen(tmp);
this->data = new char[laenge + 1];
this->length = laenge;
strcpy(this->data, tmp);
}
但是它不起作用,我也没有主意了。当然,如果我用以下方法启动它,它会起作用:
STRING test1;
test1 = (char *) "TEST";
但我的梦想是像这样使用它:stringtest1;test1=“TEST”;或
字符串test1=“TEST” 您需要一个重载,它接受
常量字符*
STRING STRING::operator = (const char* s)
{
if (data != nullptr)
delete [] data;
length = strlen(s);
data = new char[length + 1];
strcpy(data, s);
}
您需要一个重载,该重载接受
const char*
STRING STRING::operator = (const char* s)
{
if (data != nullptr)
delete [] data;
length = strlen(s);
data = new char[length + 1];
strcpy(data, s);
}
您需要为
const char*
使用重载函数,但也可以使用更快的模板函数:
template<int length>
STRING STRING::operator = (const char (&s)[length])
{
//resize or allocate data if needed
strncpy(data, s, length);
}
模板
字符串::运算符=(常量字符(&s)[长度])
{
//根据需要调整或分配数据
strncpy(数据,s,长度);
}
您需要为const char*
使用重载函数,但也可以使用更快的模板函数:
template<int length>
STRING STRING::operator = (const char (&s)[length])
{
//resize or allocate data if needed
strncpy(data, s, length);
}
模板
字符串::运算符=(常量字符(&s)[长度])
{
//根据需要调整或分配数据
strncpy(数据,s,长度);
}
您可以在以下函数中将参数类型从char*
更改为char const*
STRING(char * data);
STRING operator = (char * data);
此外,作为一个总体改进,您可以更改
STRING operator = (STRING data);
STRING operator = (const string data);
STRING operator + (STRING data);
到
看看为什么我建议的原型比您现有的更合适。您可以在以下函数中将参数类型从
char*
更改为char const*
STRING(char * data);
STRING operator = (char * data);
此外,作为一个总体改进,您可以更改
STRING operator = (STRING data);
STRING operator = (const string data);
STRING operator + (STRING data);
到
看看为什么我建议的原型比你现有的更合适。这一点在很多方面都有缺陷,无法在一篇文章中解决。最好先学习一些C++。我认为你不能把C++字符串数据类型作为指针指向char数组,即“tMP=(char *)数据”不能工作。看看这是打破了太多的方式来解决一个职位。最好先学习一些C++。我认为你不能把C++字符串数据类型作为指针指向char数组,即“tMP=(char *)数据”不能工作。查看一下,请记住此解决方案容易出现内存泄漏。@Pandrei I修复了内存泄漏问题。
STRING s;s=空PTR
将使您的实现在strlen调用中崩溃。@utnapistim:可能不会。但无论如何都是UB。@utnapistim您可以始终“=delete”一个使用std::nullptr\t的重载。调用者仍然可以传递空字符*,但此时调用者应对未定义的行为负责请记住此解决方案容易出现内存泄漏。@Pandrei修复了内存泄漏问题。STRING s;s=空PTR
将使您的实现在strlen调用中崩溃。@utnapistim:可能不会。但无论如何都是UB。@utnapistim您可以始终“=delete”一个使用std::nullptr\t的重载。调用者仍然可以传递null char*,但此时调用者要对未定义的行为负责更快、更不灵活。应该是const char(&s)[length]
。否则它将采用一个引用数组。速度更快,灵活性更低。应该是const char(&s)[length]
。否则它将获取一个引用数组。