2012-03-15 19 views
0

私はCの人ですが、現在はC++プロジェクトに取り組んでいます。私は少し混乱して取得しています理由です:C++クラスのコンストラクタ引数の数が変更されました

我々はこのような継承があります(簡単にするために、私はほとんどすべて省略さが、コンストラクタ)今
ノード - > MultiNode->ラウンドアバウト

いくつかのコードを:

class MultiNode : public sim_mob::Node { 
public: 
    MultiNode(int x, int y) : Node(x, y) {} 
... 
} 

class Roundabout : public sim_mob::MultiNode { 
public: 
    Roundabout() : MultiNode() {} 
} 

あなたが見ることができるように、ラウンドアバウト()コンストラクタはどのなしマルチノード()コンストラクタを呼び出しMultiNodeには2つの引数を持つコンストラクタが1つしかありません:

このようなシナリオは可能ですか?どのようなexpanationはどうですか?

このコードは、元の場所にもコンパイルが、私は編集を開始するためのテストエリアにフォルダをコピーしたとき、私は(私には賢明である)、このエラーを取得: エラー:sim_mob」への呼び出しに該当する機能を:: MultiNode :: MultiNode()

他の同様のファイルやクラスが存在しないと思われます。ご参考のため

エラー:

~/workspace/parser5/geospatial$ make 
Scanning dependencies of target driver 
[ 33%] Building CXX object CMakeFiles/driver.dir/geo5-pskel.cxx.o 
In file included from /home/vahid/workspace/parser5/geospatial/geo5-pskel.hxx:134:0, 
       from /home/vahid/workspace/parser5/geospatial/geo5-pskel.cxx:39: 
/home/vahid/workspace/parser5/geospatial/Roundabout.hpp: In constructor ‘sim_mob::Roundabout::Roundabout()’: 
/home/vahid/workspace/parser5/geospatial/Roundabout.hpp:34:27: **error: no matching function for call to ‘sim_mob::MultiNode::MultiNode()’** 
/home/vahid/workspace/parser5/geospatial/Roundabout.hpp:34:27: note: candidates are: 
/home/vahid/workspace/parser5/geospatial/MultiNode.hpp:42:2: note: sim_mob::MultiNode::MultiNode(int, int) 
/home/vahid/workspace/parser5/geospatial/MultiNode.hpp:42:2: note: candidate expects 2 arguments, 0 provided 
/home/vahid/workspace/parser5/geospatial/MultiNode.hpp:40:7: note: sim_mob::MultiNode::MultiNode(const sim_mob::MultiNode&) 
/home/vahid/workspace/parser5/geospatial/MultiNode.hpp:40:7: note: candidate expects 1 argument, 0 provided 
make[2]: *** [CMakeFiles/driver.dir/geo5-pskel.cxx.o] Error 1 
make[1]: *** [CMakeFiles/driver.dir/all] Error 2 
make: *** [all] Error 2 

デフォルトコンストラクタがマルチノードのために利用できないので、いいえ、あなたはそれを行う傾けるあなた

+2

'MultiNode()'がデフォルトの引数を持っていなければ、それは不可能ですが、ここではそうではないようです。コンパイルが正しく行われているファイルにいくつかのエラーステートメントを入れて、エラーが出ているかどうかを確認することができます。これにより、元の場所にファイルがコンパイルされていることを確認できます。 – iammilind

+0

さらに、iamminlindのアドバイスには、コンパイラの前処理段階だけを実行して、実際にデフォルトのコンストラクタと同じMultinodeクラスがあるかどうかを確認できます。誤って別のものを組み込んだり、#ifdefsで代替バージョンを選択したりしている可能性があります。別の名前空間から同じ名前のクラスを取得することもできるので、その名前を持つすべてのクラスのプリプロセッサ出力を検索する価値があります。 –

答えて

1

に感謝します。デフォルトのコンストラクタを作成して、引数を受け入れないか、MultiNodeコンストラクタにデフォルトの引数を渡します。

すなわち

class MultiNode : public sim_mob::Node { 
public: 
     MultiNode(int x, int y) : Node(x, y) {} 
     ... 
     MultiNode(){ 
     //.... 
     } 
}; 

又は

class MultiNode : public sim_mob::Node { 
public: 
     MultiNode(int x = def_x, int y = def_y) : Node(x, y) {} 
     ... 
     MultiNode(){ 
     //.... 
     } 
}; 
+0

これは役立つ可能性があります:http://publib.boulder.ibm.com/infocenter/ lnxpcomp/v8v101/index.jsp?topic =%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Fcplr376.htm –

1

予想されるように、このエラーがあります。

オブジェクトは、存在するコンストラクタを使用してのみ作成できます。状況によっては、デフォルトコンストラクタ(ゼロ引数コンストラクタ)が暗黙的にdefaultとして生成されますが、すでにユーザ定義のコンストラクタがあるため、この場合は適用されません。

1

それとも、意味がありませんラウンドアバウト

class Roundabout : public sim_mob::MultiNode { 
public: 
    Roundabout() : MultiNode(0, 0) {} 
    Roundabout(int x, int y) : MultiNode(x, y) {} 
} 
+0

OPが既存のコードを読み取っているとすれば、C++を使用している既存のコードがあれば驚くでしょう11のみの構文です(この構文はC++ 11でのみ有効です)。 – ildjarn

1

からのX、Yのデフォルト値はありません、あなたは正しいが、渡すことができます。 MultiNodeにデフォルトコンストラクタがない場合は、派生コンストラクタから呼び出すことはできません。あなたが得ているエラーメッセージは私が期待しているものなので、あなたの質問が何であるかは明確ではありません。

「このコードは元の場所でうまくコンパイルされますが、フォルダをテスト領域にコピーして編集を開始すると、このエラーが発生します」と述べました。それは私の「元の場所」が何であるか、それをどこかにコピーしてそれを編集しなければならなかった理由を不思議に思う。バージョン管理システムを使用しているのですか?それとも、誰もがハッキングする共有フォルダ内のコードの単一コピーに似ていますか?後者の場合、共有コピーが最新のものであり、全員の変更と一貫性があることを保証する方法はありません。おそらくMultiNode にコードのコピーにデフォルトのコンストラクタを持っていますか?

1

コンパイルする前に、ビルドプロセスがコードを何らかの形で変更していないことを確かめていますか?いくつかのプロジェクト設定が定義されていないためにトリガされないデフォルトコンストラクタ(yuck)を作成するプリプロセッサマクロがありますか?

これらの種類のものは、コードをコンパイルする原因となると思う唯一のものです。

あなたが言ったように、デフォルトのコンストラクタが存在しないため、そのコードはコンパイルしないでください。

関連する問題