2011-08-04 7 views
5

デフォルトのコピーコンストラクタに「追加」することはできますか?デフォルトのコピーコンストラクタに「追加」することはできますか?

例:このクラスのために:

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

私はちょうどa(rvalue.a)一部せず

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

を書きたいです。

あなたが求める何

+0

このデフォルトのコピーコンストラクタは簡単ではありません – Benoit

+0

なぜこれが必要ですか?あなたはクラスを変更できませんか? –

+1

ちょうど私はそれのためのコピーコンストラクタを書く必要があるので、私はちょうど単一のポインタ(と私はスマートポインタを使用することはできません)とかなり大きいクラスがありますが、コピーコンストラクタのほとんどは、どちらかというと –

答えて

8

(悪い/醜いコードと可能なメモリリークを無視する)は不可能です。独自のコピーコンストラクタを宣言すると、コンパイラはコピーコンストラクタを生成しません。つまり、デフォルトのコピーコンストラクターが存在しないため、単純に追加または拡張することはできません。話すのはすべてか何もない。

+0

これは、コピーコンストラクタの作成が必要なこと(つまり、裸のポインタ)を避けるもう一つの理由でもあることに注意してください。他に選択肢がない限りはありません。 –

5

不可能です。あなたは、「デフォルトコピー」フィールドの数が多いために冗長なコードを減らしたい場合は、それはintermdiate継承して達成することができる。

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++でサポートされていない:あなたが持つことができません半分のデフォルトコンストラクタ。

しかし、あなたが達成したいが、以下の小さなトリックで行うことができます。

以下この小さなデモを注意してください多くの欠陥(メモリリークなど)を持っているので、それだけでdemostrationのためにのみ暫定ソリューションです。

//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

私はこれが既に言及されていると思うuser396672 –

+0

私はあなたの質問を読んで、この解決策を自分自身でしか知りませんでした... – Gob00st

関連する問題