复制构造函数并从方法获取数据

时间:2019-07-09 09:51:32

标签: c++ object

所以我试图为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();

做什么?

4 个答案:

答案 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;
}