2011-08-25 62 views
1

我試圖建立一個拷貝構造函數,我得到這個錯誤過客「常量類2」爲「本」的論點「廉政的Class1 :: GET_DATA()」丟棄預選賽

class Class1{ 
public: 
    int get_data(); 
    void set_data(int); 
private: 
    int d; 
}; 

int Class1::get_data(){ 
    return d; 
} 

void Class1::set_data(int data){ 
    d = data; 
} 

class Class2 : public Class1{ 
    Class2(const Class2&); 
}; 

Class2::Class2(const Class2 &c2) : Class1(){ 
    set_data(c2.set_data()); 
} 

什麼解決這個問題。我閱讀了一些以前的問題,我明白爲什麼會發生這種情況。但是set_data()const不是一個選項。

什麼是複製構造函數的公認方法?

感謝,

+0

你沒有提供足夠的參數'c2.set_data()'的'的Class2'的構造體。另外'set_data()'返回'void',所以你不能使用它的「值」傳遞給'set_data()'。問題標題中的錯誤消息與您發佈的代碼不匹配。 –

回答

3

你可以只寫一個構造的Class1採取一個int參數:

class Class1 { 
    explicit Class1 (int i) : d (i) {} 
    // as before 
}; 

class Class2 : public Class1 { 
    Class2 (Class2 const & c2) : Class1 (c2.get_data()) {} 
}; 

不過,默認的拷貝構造函數應該在這裏足夠多(即你不需要寫自己,編譯器會爲你做)。

一般來說,你應該使用初始化列表:

http://www.parashift.com/c++-faq-lite/ctors.html

在車隊

(閱讀在FAQ整個條目)

編輯:你忘了 'const' 限定符爲您GET_DATA功能。

0

你不想:

set_data(c2.get_data()); 

(並使Class1::get_data()成員函數const)?

但你真的應該使用構造函數初始化列表:

Class2::Class2(const Class2 &c2) 
    : Class1(c2) 
{ 
} 

該代碼使用Class1編譯器生成默認的拷貝構造函數。在很多情況下,你不應該使用默認的拷貝構造函數或者copy-assign操作符重載,但是這裏沒什麼問題,因爲Class1的唯一數據成員是int對象。

事實上,你甚至可以依靠編譯器生成的默認拷貝構造函數Class2

編輯:下面是一些示例代碼:

#include <iostream> 

class Class1{ 
public: 
    Class1() : d(0) { } // Provide a no-arg constructor to initialize `d` 

    int get_data() const; // Class1::get_data() is `const` because it does not change the `Class1` object. 
    void set_data(int); 
private: 
    int d; 
}; 

int Class1::get_data() const{ 
    return d; 
} 

void Class1::set_data(int data){ 
    d = data; 
} 

class Class2 : public Class1{ 
public: 
    Class2(); 
}; 

Class2::Class2() 
    : Class1() 
{ 
} 

int main() { 
    Class2 other_c2; 
    other_c2.set_data(14); 
    Class2 c2(other_c2); 
    std::cout << c2.get_data() << '\n'; 
} 

http://codepad.org/jlplTYrH

相關問題