2011-08-16 21 views
0

私は作っているばかりの文法エラーだと確信していますが、CLimbから派生したクラスCNeckがデフォルトのコンストラクタを呼び出すと、別のコンストラクタCNeck(*parent)を呼び出すと、指定された基本コンストラクタの約半分を呼び出すように見えますが、コンパイラのデフォルトのコンストラクタや何か変わったものが使われます。派生クラスが全体のベースコンストラクタを呼び出さない派生クラス

main.cppに

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    CNeck neck01; 
    CLimb *ptr; 
    ptr = &neck01; 
    CNeck neck02(ptr); 
    return 0; 
} 

limb.h(親クラス)

class CLimb 
{ 
public: 
    CLimb(void); 
    CLimb(CLimb *_parent); 
    ~CLimb(void); 

    float cut; 
    float bone; 
    float resistance; 
    //attributes 
    bool isBurned; 
    bool isBleeding; 
    bool isOnFire; 
    bool isNeedFirstaid; 

    CLimb *parent; 
}; 

limb.cpp(親クラス)

#include "limb.h" 

CLimb::CLimb(void) : 
    cut(10), 
    bone(10), 
    resistance(10), 
    //attributes 
    isBurned(0), 
    isBleeding(0), 
    isOnFire(0), 
    isNeedFirstaid(0) 
{ 
    parent = NULL; 
} 

CLimb::CLimb(CLimb *_parent) : 
    cut(10), 
    bone(10), 
    resistance(10), 
    //attributes 
    isBurned(0), 
    isBleeding(0), 
    isOnFire(0), 
    isNeedFirstaid(0) 

{ 
    parent = _parent; 
} 

CLimb::~CLimb(void) 
{ 
} 

neck.h(子クラス)

#include "limb.h" 
class CNeck : 
    public CLimb 
{ 
public: 
    CNeck(void); 
    CNeck(CLimb *_parent); 
    ~CNeck(void); 
}; 

neck.cpp(子クラス)

#include "Neck.h" 


CNeck::CNeck(void) 
{ 
} 

CNeck::CNeck(CLimb *_parent) : CLimb(*_parent) 
{ 
} 

CNeck::~CNeck(void) 
{ 
} 

あなたが見ることができるように、子クラスは親のコンストラクタを呼び出す以外に何もしない、まだ私はプログラムをステップ実行するとき、私は次の取得結果:
CNeck neck01;:通常
:値cut、bone、resistance、isBurnedはすべて適切な値を持ちますが、isBleeding、isOnFire、およびisNeedFirstaidはすべて0ではなく1に等しくなります。 CNeck :: CNeck(* parent)の本体はまだ実行されています。
CNeck neck02(ptr);の代わりにCLimb limb(ptr);をテストして呼び出すと、すべての値に正しい値が割り当てられました。

+0

「手」とは何ですか? – Beta

+1

それは悲しいクラスです – AngryWhenHungry

+0

申し訳ありませんが、私はコピー貼り付けエラーを修正しました。 –

答えて

1

あなたのコンストラクタは、それが登るへのポインタを取りますが、CNeckコンストラクタ、

CNeck::CNeck(CLimb *_parent) : CLimb(*_parent) 

にあなたはコピーコンストラクタであるCLimb(CLimb&)を呼び出すポインタを、逆参照だという意味CLimb(CLimb *_parent);をマークされています。 *_parent_parentに設定してこの問題を解決してください。さらに、コピーコンストラクターを定義することもできます。消耗サイクルを避けるために

CLimb *ptr = &hand; 

CLimb *ptr; 
ptr = &hand; 

これを行う:他のニュースで

は、これをしません。

また、パラメータを持たない関数(パラメータはCではなくCのやり方である)のパラメータリストにはvoidは必要ありません。だから、例えば:

CLimb(void); 
CLimb(CLimb *_parent); 
~CLimb(void); 

CLimb(); 
CLimb(CLimb *_parent); 
~CLimb(); 

であるべき私はそれがあなたの質問に関連していないと知っているが、それは良いスタイルです。

2
CNeck::CNeck(CLimb *_parent) : CLimb(*_parent) 

ほかに

CNeck::CNeck(CLimb *_parent) : CLimb(_parent) 

する必要があり、私は本当にこれがコンパイル方法を理解していない:

ptr = &hand; 

hand

は全く宣言していますが、コピーしながら、それを逃したように見えるされていませんここにコードを貼り付けます。

関連する問題