Копировать конструктор и получать данные из методов - PullRequest
1 голос
/ 09 июля 2019

Итак, я пытаюсь написать конструктор копирования для класса 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 ]

5 голосов
/ 09 июля 2019

Вы должны сделать свой метод const

const vector<int>& getStart() const {return start; }
5 голосов
/ 09 июля 2019

Вам необходимо сделать getStart() функцию-члена const.Это то, что говорит вам компилятор.

 const vector<int>& getStart() const {return start; }

Кроме того, в этом случае вы можете жить с созданным компилятором конструктором копирования.Он сделает копию для каждого члена, что хорошо для std::vector<int>.Это дает преимущество, заключающееся в том, что компилятор также сгенерирует для вас конструктор перемещения и оператор присваивания перемещения (предотвращение этого будет обеспечено с помощью специального конструктора копирования), что имеет смысл, если у вас есть элемент данных std::vector, так как они дешевы для конструирования перемещения.

4 голосов
/ 09 июля 2019

Неконстантные функции-члены не могут быть вызваны для константного объекта, как toCopy.Вы должны пометить getStart() как const.

const vector<int>& getStart() const { return start; }
//                            ^^^^^

. Кстати: ваш конструктор копирования по умолчанию инициализирует элемент данных m_start, а затем назначит его в теле конструктора копирования.Было бы лучше реализовать как

Orbit::Orbit(const Orbit& toCopy) : m_start(toCopy.m_start) {}

, т.е. инициализировать m_start напрямую;или примените сгенерированный компилятором тот, который делает то же самое, что и выше.

3 голосов
/ 09 июля 2019

Методы должны быть помечены как const, чтобы вызываться для const-объектов и ссылок.Вот как это исправить:

const vector<int>& getStart() const 
{ 
    return start;
}

Вы можете проверить ссылку , чтобы узнать больше.

Обратите внимание, что вы можете использовать auto для упрощения подписи:

auto& getStart() const 
{ 
    return start;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...