Копировать конструкторы и вызывающие функции - PullRequest
2 голосов
/ 18 апреля 2010

Я пытаюсь вызвать функцию доступа в конструкторе копирования, но она не работает. Вот пример моей проблемы:

хиджры

class A {

public:
    //Constructor
    A(int d);
    //Copy Constructor
    A(const A &rhs);

    //accessor for data
    int getData();

    //mutator for data
    void setData(int d);

private:
    int data;
};

a.cpp

#include "A.h"

//Constructor
A::A(int d) {
    this->setData(d);
}

//Copy Constructor
A::A(const A &rhs) {
    this->setData(rhs.getData()); 
}

//accessor for data
int A::getData() {
    return data;
}

//mutator for data
void A::setData(int d) {
    data = d;
}

Когда я пытаюсь скомпилировать это, я получаю следующую ошибку:

error: passing 'const A' as 'this' argument of 'int A::getData()' discards qualifiers

Если я изменю rhs.getData() на rhs.data, то конструктор работает нормально. Разрешено ли мне вызывать функции в конструкторе копирования? Может кто-нибудь сказать мне, что я делаю не так?

Ответы [ 2 ]

8 голосов
/ 18 апреля 2010

Проблема в том, что rhs объявлен как const, но getData() - нет, поэтому он может изменить rhs, когда вы вызываете его, даже если rhs предположительно является постоянным Поскольку getData() является средством доступа, оно также должно быть const:

//accessor for data
int getData() const;
3 голосов
/ 18 апреля 2010

Ваш «метод доступа» может быть вызван только для неконстантных объектов, поскольку он не помечен как const. Вы должны объявить это:

int getData() const;

Тогда вам разрешено вызывать его на rhs, который является константной ссылкой.

...