Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 奇怪的赋值问题-C++;_C++_Variable Assignment - Fatal编程技术网

C++ 奇怪的赋值问题-C++;

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

在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
是如何进行赋值的?

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*
。谢谢这就是解决办法