2010-12-13 8 views
1

私はC++プログラミングの新人です。あなたが私を助けることができれば幸いです。 私はこのコードを書き込もうとしました:C++の新しいオブジェクト

bool RailwayLineList:: AddInTail(const RailwayLine& data) 
{ 
    //there is no linked list to add the element 
    if(this==NULL) 
     return false; 
    RailwayLineLink *newLink = new RailwayLineLink(data); 
} 

私はそれをデバッグしようとしたとき、私は(クラスがデフォルトのコンストラクタを使用している)コピーコンストラクタが呼び出されていたとのデータがいくつかのゴミで初期化されていたことがわかりました。

なぜコピーコンストラクタが呼び出されていますか?

+0

にStackOverflowに歓迎こんにちは、:あなたはコピーコンストラクタを実装する際に

通常、このように、コピーに元からmemberwiseコピーのいくつかの種類をしたいと思います。将来的には、コードを書くときには強調表示し、バイナリでボタンをクリックする必要があります。これは、正しく表示されるようにフォーマットします。 :-) –

+1

'RailwayLineLink'コンストラクタが表示されていないと、あなたはそれを言うのが難しいですが、確かに"あなたがそれを求めたので "のように見えます。空のコピーコンストラクタにブレークポイントを設定します(どのクラスについて質問していますか?)、コールスタックを確認してください。 –

+0

@Platinum Azure:WTF ?!私が書いたコードのすべての行にスペースを手動で追加しました! ;( – BlackBear

答えて

1

if (this == NULL)は技術的には有効な構造ですが、到達するまでにステートメントが真である場合は未定義の動作が既に生成されています。こんなことしないで!!!

+0

これは、コメントまたは実際の回答の補遺としての方が良いかもしれません。 – 3Doubloons

+0

これはコメントであり、答えではありません。 –

+0

これをNULLと比較することに何も問題はありません。これがNULLになる原因は問題の実際の原因です。 –

2

コピーコンストラクタは、特定のシグネチャを持つコンストラクタです。構築される同じ型へのconst参照の単一のパラメータをとります。だから、class Fooのために、コピーコンストラクタは次のようになります。デフォルトと変換:

Foo::Foo(const Foo&) 

コンストラクタの2他の種類があります。デフォルトコンストラクタはパラメータを取りません(または、それがパラメータを取らなかったかのように呼び出すことができ、例えば、すべてのパラメータがデフォルト値を持っている):

Foo::Foo() 

...と変換デストラクタは、基本的に他の何かです。たとえば、次のように

Foo::Foo(const Bar&) 

はなぜコピーコンストラクタが呼び出されていますか?あなたのケースでは

、あなたはRailwayLineLinkコンストラクタを呼び出すが、RailwayLineにconst参照を渡し、あなたが実際に変換コンストラクタではなく、コピーコンストラクタを呼び出しているしています。

あなたがそれを呼ばれるので、変換コンストラクタが呼び出されます。

new RailwayLineLink(data); 

これはコンストラクタへの唯一のパラメータとしてdataを渡して、新しいRailwayLineLinkオブジェクトを作成します。

あなたはこのような何かに見える空の変換コンストラクタ、持っている場合:

RailwayLineLink::RailwayLineLink(const RailwayLine&) 
{ 
} 

を...そして新しいコピーのすべてのメンバーは、デフォルトの構築になり、おそらくゴミが含まれています。

RailwayLineLink::RailwayLineLink(const RailwayLine& rhs) 
: value_(rhs.value_) 
{ 
} 
+0

慎重に見てください。 'data'パラメータは実際には' const RailwayLine& '型です。これはおそらく' const RailwayLineLink 'とは異なると思います。質問の編集履歴が与えられているにもかかわらず、誤植かもしれません! * –

+0

「RailwayLine」、「RailwayLineLink」、または「RailwayLineList」のうち、どのコピーコンストラクタが予期せず呼び出されているかについての質問者は明確ではありません。(編集:誤植について言えば、 –

+0

@プラチナ:ああ、そうだよ!私はそれを完全に逃した。 –

関連する問題