在GCC编译器中创建新的字符串类并为其分配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
如何完成作业?
答案 0 :(得分:2)
std :: string可以进行转换,因为它定义了conversion constructor。这样的事情。
class std::string {
// ...
std::string(const char *);
};
注意:实际的std :: string更复杂。
使用赋值运算符,您应该可以
StdString str;
str = "hello";
但不是
StdString str = "hello";
答案 1 :(得分:1)
您遇到的错误是不提供带char*
的构造函数。这是编译器抱怨丢失的转换函数。
StdString::StdString(char const* s)
{
// ...
}
此外,如果您的内部字符串是std::string
,那么您不需要任何赋值运算符,复制构造函数和析构函数。添加char*
转换构造函数后,编译器提供的赋值运算符也将神奇地用于char*
。好吧,不是很神奇:编译器会看到它可以通过转换构造函数将char *
转换为StdString
,然后将其与隐式赋值运算符一起使用。
您也可以将默认构造函数的定义保留为空;这将为您提供所有成员的默认构造,这可能已经足够了。
答案 2 :(得分:1)
StdString mystr =“Hello world!”;
需要复制构造函数。
尝试添加以下内容:
StdString::StdString(const char* other)
{
internstr = other;
}
答案 3 :(得分:0)
看起来你混淆了分配和初始化。初始化使用构造函数,即使使用“=”符号调用它也是如此。
答案 4 :(得分:0)
为什么要将转换运算符定义为:
char* StdString::operator=(StdString other)
{
return other.cstr();
}
所有这些确实会返回other
的内容而不将当前类的internstr
设置为其他类提供的内容。
我会做的更像是:
StdString& StdString::operator=(StdString other)
{
// copy contents of other to this->internstr
return *this;
}