2010-04-17 83 views
2

我想調用副本構造函數中的存取函數,但它不工作。這裏是我的問題的一個例子:複製構造函數和調用函數

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,然後構造函數正常工作。我不允許在複製構造函數中調用函數嗎?有人能告訴我我做錯了什麼嗎?

+0

您不需要爲此使用訪問器。一個類自動成爲它自己的朋友。因此,對象X可以讀取對象Y的私有成員,如果它們是相同的類型。假定代碼的作者知道他在做什麼和實現細節,因此不需要保護自己。 – 2010-04-18 09:25:56

回答

8

問題是rhs聲明爲const,但getData()是沒有,所以它可以被修改rhs當你調用它,即使rhs是假想常量。作爲getData()是一個訪問,它應該是const太:

//accessor for data 
int getData() const; 
+0

謝謝。 -helixed – LandonSchropp 2010-04-17 23:10:31

3

你的「訪問」只能在非const對象調用,因爲它未標記常量。你應該聲明它:

int getData() const; 

然後你可以在rhs,這是一個const引用。

+0

有道理。謝謝。 -helixed – LandonSchropp 2010-04-17 23:15:18