所以我试图为Orbit类编写一个副本构造函数:
class Orbit
{
private:
vector<int> m_start;
public:
// ...
const vector<int>& getStart() {return start; }
}
喜欢:
Orbit::Orbit(const Orbit& toCopy)
{
m_start = toCopy.getStart();
}
但是我得到的只是:
orbit.cpp:60:29: error: passing ‘const Orbit’ as ‘this’ argument discards qualifiers [-fpermissive]
m_start = toCopy.getStart();
做什么?
答案 0 :(得分:5)
您需要使getStart()
成员函数const
。这就是编译器告诉您的。
const vector<int>& getStart() const {return start; }
此外,在这种情况下,您可以使用编译器生成的副本构造函数。它将执行成员级复制,这对std::vector<int>
来说很好。这样做的好处是,编译器还将为您生成move构造函数和move赋值运算符(提供自定义副本构造函数可以防止这种情况发生),如果您有std::vector
数据成员,这是很有意义的,因为它们移动起来很便宜-构造。
答案 1 :(得分:5)
您必须使方法const
const vector<int>& getStart() const {return start; }
答案 2 :(得分:4)
不能在像toCopy
这样的const对象上调用非const成员函数。您必须将getStart()
标记为const
。
const vector<int>& getStart() const { return start; }
// ^^^^^
顺便说一句:您的副本构造函数将默认初始化数据成员m_start
,然后将其分配给副本构造函数的主体。最好将其实现为
Orbit::Orbit(const Orbit& toCopy) : m_start(toCopy.m_start) {}
即直接初始化m_start
;或应用由编译器生成的代码,其功能与上述相同。
答案 3 :(得分:3)
方法必须标记为const才能在const对象和引用上调用。解决方法如下:
const vector<int>& getStart() const
{
return start;
}
您可以查看reference了解更多信息。
请注意,您可以使用auto
来简化签名:
auto& getStart() const
{
return start;
}