所以我有一个小片段,它认为"abc"不是一个字符串,而是一个const char[4],所以我不能将它分配给我的对象。我搜索过,但没有找到任何有效的解决方案。提前谢谢。
Tekst t = "abc";
Tekst Tekst::operator=(std::string& _text){
return Tekst(_text);
}
编辑:由于这是我的面向对象编程课程中几乎每一个练习的主要内容,无论出于何种原因,我们都无法更改int main()
中的任何内容,因此更改Tekst t = "abc";
是不可能的。
编辑2:Tekst(std::string _text) :text(_text) {};
编译器不认为"abc"
是const char [4]
。它是const char [4]
,而您认为它应该是std::string
,这是不正确的。std::string
可以由const char *
隐式构造,但它们并不完全相同。
您的问题实际上是试图将临时绑定到非常量引用,这在C++中是不可能的。您应该将操作员的定义更改为
Tekst Tekst::operator=(const std::string& _text){
// ^ const here
return Tekst(_text);
}
这将使您的运算符在技术上有效(如中所示,它会编译并且没有未定义的行为(。然而,它做了一些非常不直观的事情。考虑以下内容:
Tekst t;
t = "abc";
在本例中,t
内部没有任何"abc"
。新返回的对象被丢弃,并且t
保持不变。
最有可能的是,你的运营商应该是这样的:
Tekst& Tekst::operator=(const std::string& _text){
this->text = _text; //or however you want to change your object
return *this;
}
请参阅运算符重载的基本规则和习惯用法,以了解有关每个运算符中期望的内容和不期望的内容的更多信息。
在一个半相关的注释中,您可以从C++14及以上版本的文字中获得std::string
:
#include <string>
using namespace std::string_literals;
int main() {
auto myString = "abc"s;
//myString is of type std::string, not const char [4]
}
然而,这对您的情况没有帮助,因为主要问题是将临时引用绑定到非常量引用。
感谢@Ted Lyngmo,"这应该会有所帮助:godbolt.org/z/j_RTHu",我所要做的就是添加一个单独的构造函数来接收const char*
Tekst(const char* cstr) : Tekst(std::string(cstr)) {}
Tekst t = "abc";
只是Tekst t("abc");
的语法糖,这意味着它甚至根本不考虑您的operator=
,而是使用类的构造函数。
为了编译Tekst t = "abc";
,您需要一个接受const char*
或const std::string&
作为输入的构造函数。但是,您展示的构造函数按值而不是按常量引用获取std::string
,因此它不能用于字符串文字。因此,您需要为此添加一个新的构造函数:
Tekst(const char *_text) :text(_text) {};