奇怪的赋值问题 - C++
问题描述:
在GCC编译器中创建一个新的字符串类并为其分配一个char*
的数组有一个奇怪的问题。源代码:奇怪的赋值问题 - C++
#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可以进行转换,因为它定义了一个conversion constructor。像这样的东西。
class std::string {
// ...
std::string(const char *);
};
注意:实际的std :: string更为复杂。
随着赋值运算符,你应该能够做到
StdString str;
str = "hello";
但不
StdString str = "hello";
答
看起来你是在混淆分配和初始化。初始化使用构造函数,即使使用“=”符号调用时也是如此。
答
为什么你定义的转换操作符为:
char* StdString::operator=(StdString other)
{
return other.cstr();
}
这一切都不会返回的other
内容,无需设置当前类的internstr
到其他给定的。
我会怎么做,看起来更像是:
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 = "Hello world!";
需要复制构造函数。
尝试添加以下内容: “你好!世界”
StdString::StdString(const char* other)
{
internstr = other;
}
发生在我设置StdString myStr中=; – IDWMaster
请考虑在这里发布一个最简单的工作示例。 –
你为什么使用pastebin?代码将适合在这里。 –