2009-03-27 5 views
0

イム私のコピーコンストラクタと「ディープコピー」のコピー一部をやろうとしている:リストinitalizerベースでwhataver varaible /メンバーを初期化する必要があり」、それだけでコピーコンストラクタ

class myClass 
{ 
public: 

    myClass (const char *cPtr, const float fValue) 
    myClass (const myClass& myClassT); 

private: 

    const char* &myAddress; 
    float MyFloater; 

}; 

//myClass.cpp 

myClass::myClass(const char *cPtr, const float fValue) 
{ 
// Initialize both private varaible types 
    const char* &myAddress = cPtr; 
    float myFloater = fValue; 
} 

myClass::myClass(const myClass& classType) 
{ 
// copy what we did ... 
     myAddress = myClass.myAddress; 
     myFloater = myClass.myFloater; 
} 

、イムのみを取得。

彼らは、コンストラクタでinitalizedさ 私がするClassTypeオブジェクトのアドレスをどうするかが必要になります

+0

あなたのクラス宣言では、あなたがMyFloaterプライベートメンバを持っていますが、定義の中で、あなたがmyFloaterを使うのか?また、使用するコーディングスタイルを決定し、それと一貫性を持たせる必要があります。たとえば、最初の大文字と変数名を小文字で書きます。 –

答えて

3

いくつかの問題:!?

1)なぜ、最初のコンストラクタで変数宣言を繰り返すのですか?

2)なぜポインタとしてではなく、参照としてmyAddressを宣言していますか? 参照は常にコンストラクタ初期化リストで初期化する必要があります。これは、おそらくエラーメッセージの原因です。コンストラクタ本体の初期化はC++では受け入れられません。この理由は、オブジェクトが構築されているどのように関係している

myClass::myClass(const myClass& classType):myAddresss(classType.myAddress), myFloater(classType.myFloater) 
{ 
} 

:二コンストラクタで

は、おそらくのような何かをしたいです。コンストラクタの本体が実行される時点で、オブジェクトはすでに "ビルド"されているとみなされているので、参照はすでに有効であるはずです。したがって、C++では参照の割り当てが拒否されます。

ところで、これは本当に深いコピーではありません...

7
const char* &myAddress; 

が参照され、それはコンストラクタ中に初期化子リストで初期化されなければならない、すなわち

myClass::myClass(const char *& cPtr, const float fValue): myAddress(cPtr) 

ポインタが渡された場合、スコープから外れてしまったため、これは悪いことです(もちろん、何をしようとしているかによって異なります)。

これを行う良い方法は、何をしようとしているかによっては、ポインタをコピーして "深い"コピー中に、その内容を再割り当てしてコピーすることです。あなたが実際にポインタへの参照を必要としない限り、もちろんです。

2

コンストラクタのメンバーを初期化していないため、クラス内の同じ名前の新しいローカル変数が2つ宣言されています。そして、初期化リストでそれらを初期化すると、次のようになります。他の人があなたが本当に何をやっていることは、同じことを指すようにポインタを設定することをされた「ディープコピー」を行っていない、言ったことに加えて、

myClass::myClass(const char *cPtr, const float fValue) 
    : myAdress(cPtr), myFloater(fValue) 
{ 
} 
3

を深いコピーではありません。ポインタが指しているものを複製して、安全な側に置く必要があります。

0

はこのようにあなたのコードを持ってみてください。

class myClass 
{ 
public: 

    myClass (const char *cPtr, const float fValue); 
    myClass (const myClass& myClassT); 

private: 

    const char* &myAddress; 
    float MyFloater; 

}; 

//myClass.cpp 

myClass::myClass(const char *cPtr, const float fValue) : myAddress(cPtr), MyFloater(fValue) 
{ 
} 

myClass::myClass(const myClass& classType) : myAddress(classType.myAddress), MyFloater(classType.MyFloater) 
{ 
// copy what we did ... 
} 
関連する問題