C++ 奇怪的赋值问题-C++;
在GCC编译器中创建一个新的字符串类并为其分配一个C++ 奇怪的赋值问题-C++;,c++,variable-assignment,C++,Variable Assignment,在GCC编译器中创建一个新的字符串类并为其分配一个char*数组时遇到了一个奇怪的问题。源代码: #include "../Include/StdString.h" StdString::StdString() { //ctor internstr = std::string(); } char* StdString::operator=(StdString other) { return other.cstr(); } StdString StdString::o
char*
数组时遇到了一个奇怪的问题。源代码:
#include "../Include/StdString.h"
StdString::StdString()
{
//ctor
internstr = std::string();
}
char* StdString::operator=(StdString other) {
return other.cstr();
}
StdString StdString::operator+(StdString other) {
StdString newstr = StdString();
newstr.internstr = internstr+other.internstr;
return newstr;
}
void StdString::operator=(char* other) {
internstr = other;
}
StdString::~StdString()
{
//dtor
}
char* StdString::cstr() {
return (char*)internstr.c_str();
}
错误:请求从char*
转换为非标量类型StdString
std::string
是如何进行赋值的?std::string可以进行转换,因为它定义了一个。像这样的
class std::string {
// ...
std::string(const char *);
};
注意:实际的std::字符串更复杂
使用赋值运算符,您应该能够执行以下操作
StdString str;
str = "hello";
但不是
StdString str = "hello";
看起来您混淆了赋值和初始化。初始化使用构造函数,即使使用“=”符号调用它。为什么将转换运算符定义为:
char* StdString::operator=(StdString other)
{
return other.cstr();
}
所有这些都会返回other
的内容,而不会将当前类的internetr
设置为other给定的内容
我会做的看起来更像:
StdString& StdString::operator=(StdString other)
{
// copy contents of other to this->internstr
return *this;
}
您遇到的错误是没有提供接受
char*
的构造函数。这是编译器抱怨缺少的转换函数
StdString::StdString(char const* s)
{
// ...
}
另外,如果您的内部字符串是std::string
,则不需要任何赋值运算符,即复制构造函数和析构函数。一旦添加了char*
转换构造函数,编译器提供的赋值操作符也将神奇地为char*
工作。嗯,这并不是很神奇:编译器将看到它可以通过转换构造函数将char*
转换为StdString
,然后将其与隐式赋值运算符一起使用
也可以将默认构造函数的定义保留为空;这将为您提供所有成员的默认构造,这可能已经足够好了
StdString mystr=“你好,世界!”
需要复制构造函数
尝试添加以下内容:
StdString::StdString(const char* other)
{
internstr = other;
}
当我设置StdString mystr=“Hello world!”时发生;请考虑张贴一个最小的工作例子。为什么你使用巴斯丁?代码将适合这里。代码没有像通常那样从我的IDE粘贴(缩进不正确),所以我认为使用pastebinDid会更快。如果您在这个方法上得到错误:void StdString::operator=(char*other)?我对这个操作符重载感到奇怪。如果
StdString
更像std::string
,那么初始化也必须工作std::string
有一个重载构造函数,其参数类型为const char*
。谢谢这就是解决办法