2011-08-04 105 views
5

是否可以「添加」到默認的拷貝構造函數?是否可以「添加」到默認的拷貝構造函數?

例如,對於這個類:

class A 
{ 
    public: 
     int a; 
     int* b; 
}; 

我只想寫

A::A(const A& rvalue): 
    a(rvalue.a), 
    b(new int(*(rvalue.b))) 
{} 

沒有a(rvalue.a)部分。

(忽略壞/醜陋的代碼和可能的內存泄漏)

+0

這個默認的複製構造函數不是微不足道的 – Benoit

+0

爲什麼你需要這個?你不能改變班級嗎? –

+1

這只是我有一個相當大的類,只有一個指針(我不能使用智能指針),所以我需要爲它寫一個拷貝構造函數,但大部分拷貝構造函數只是做默認的拷貝構造函數會做 –

回答

8

你問什麼是不可能的。一旦聲明瞭自己的拷貝構造函數,編譯器就不會爲你生成拷貝構造函數。這意味着你將無法簡單地添加或增加默認的拷貝構造函數,因爲它不會存在。這是全部或沒有,可以這麼說。

+0

請注意,這也是避免需要編寫複製構造函數的操作(即:裸指針)的另一個原因。除非你沒有別的選擇。 –

5

這是不可能的。

struct A1 { 
    int a1; 
    int a2; 
    // .... 
    int aN; 
}; 

struct A:public A1 
{ 
    int* b; 
    A(const A& rhs): A1(rhs), b(new int(*(rhs.b))) {} 
}; 
1

你想要做的不是nartually由C++的支持是什麼:你不能擁有但是,如果你想減少冗餘代碼爲大量的「默認複製」字段,可以用隨中級繼承來實現一半的默認構造函數。

但是,你想要什麼,實現可以通過下面的小技巧來實現:

請注意這個小演示下面有很多缺陷(內存泄漏等),所以它僅適用於筆畫演示臨時解決方案只:

//class A hasa large number date members(but all can take advantage of default 
//copy constructor 
struct A{ 
    A(int i):a(i){} 
    int a; 
    //much more data memberS can use default copy constructor all in class A 
}; 

//class B is simply wrapper for class A 
//so class B can use the default constructor of A 
//while just write copy constructor for a raw pointer in it's copy constructor 
//I think this is what OP want ? 
struct B 
{ 
    B(int i,int j):m_a(i),m_b(new int(j)){} 

    B(const B & rval): 
    m_a(rval.m_a), 
    m_b(new int(*rval.m_b)) 
    { 
    } 
    A  m_a; 
    int * m_b; 
}; 

int main() 
{ 
    B c(2,3); // a=2, *m_b=3 
    B d(c); //after copy constructor, a=2, *m_b=3 
} 
+0

我認爲這已經被用戶提及396672 –

+0

我不知道,因爲我只是閱讀你的問題,並自己動手解決這個問題...... – Gob00st