我是C ++的新手。我搜索了很多次,但仍然无法得到答案。我正在写一个名为Course的课程来描述学生在学校学习的课程。 Course类有3个文件:
protected:
string courseName;
int courseNum;
float score;
我有一个公共方法“setName”来设置课程名称:
Course &setName(string name)
{
this->courseName(name);
return (*this);
}
但是,当我尝试编译时,编译器抱怨: C ++错误:无法匹配调用'(std :: string {aka std :: basic_string})(std :: string&)' 我还尝试将代码修改为课程& setName(字符串和名称)...... 并且编译器一直抱怨同样的错误。
但是,如果我将代码更改为:
Course &setName(string name)
{
this->courseName = name;
return (*this);
}
然后它运作良好。我无法理解编译器在抱怨什么以及为什么我不能使用直接初始化?
答案 0 :(得分:6)
我无法理解编译器在抱怨什么以及为什么我不能使用直接初始化?
因为那不是初始化。这是一项任务。赋值和(复制)初始化都使用=
符号,但不要让它欺骗你:这两件事情根本不同。
初始化是指构造时对象的值。调用setName()
成员函数时,已经构造了调用它的对象(以及它的数据成员)。如果你想在那里初始化它们,你迟到了:你错过了火车。
另一方面,在构造函数的初始化列表中,您可以按如下方式初始化数据成员:
Course::Course(std::string name) : courseName(std::move(name)) { }
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^
// This would be initialization
答案 1 :(得分:1)
您正在尝试将一个字符串的值分配给另一个已经初始化的字符串。其语法是
std::string s1 = ....;
std::string s2 = ....;
s2 = s1; // OK, assignment
而你正在尝试相当于
s2(s1); // error, this is no way to assign s1 to s2
在这种情况下,语法无效。您不能初始化已构建的对象。