2011-07-20 21 views
2

基本的に私はVisaMuxというクラスとMuxPathというクラスを持っています。 MuxPathには、VisaMuxプライベートインスタンス変数があります。私はMuxPathのコンストラクタに空のVisaMux()コンストラクタを呼び出さずに、インスタンス変数に与えられたVisaMuxオブジェクトを代入します。インスタンス変数をC++でコンストラクタを呼び出さずに代入する方法はありますか?

5 MuxPath::MuxPath(const uint& Clk_sel, const uint& Lane_sel, const VisaMux& Mux){ 
6  clk_sel = Clk_sel; 
7  lane_sel = Lane_sel; 
8  mux = Mux; 
9 } 

エラーでこのコードの結果:

MuxPath.cpp:5: error: no matching function for call to ‘VisaMux::VisaMux()’ 
VisaMux.h:20: candidates are: VisaMux::VisaMux(const std::string&, const uint&, const uint&, const std::vector<VisaLane, std::allocator<VisaLane> >&, const std::vector<VisaResource, std::allocator<VisaResource> >&) 

は、あなたが見ることができるように、それは最初の行(5行目)のエラー、何らかの形でのconst VisaMux & MUXは(VisaMuxを呼び出しているようです)、それは存在しません。これは私がVisaMux Muxを使っている場合にも発生します。

私はVisaMuxをコンストラクタに必要なすべてのパラメータを渡すだけで作成したいので、VisaMuxの空のコンストラクタを呼びたくはありません。

どうすればいいですか?

+0

答えは以下のとおりで、初期化リストの構文を使用するように指示します。初期化構文の使用を好むべきであると付け加えたいだけです。それ以外の場合は、パラメータリストのオブジェクトを2回構築することがよくあります。デフォルトでは1回、コンストラクタの本体の中では1回です。また、宣言したのと同じ順序で項目を初期化リストに入れておく必要があります(S. Meyers Effective C++ item 13参照) – Tod

+0

@Andrew Wiens:この回答を見る[ここ](http://stackoverflow.com/質問/ 6724626/c-constructor/6724639#6724639)は、コンストラクタ本体内でのmemberwise初期化と代入の違いについて説明しています –

答えて

6

は、コンストラクタの初期化リストを使用します。

MuxPath::MuxPath(const uint& Clk_sel, const uint& Lane_sel, const VisaMux& Mux) 
     : clk_sel(Clk_sel) 
     , lane_sel(Lane_sel) 
     , mux(Mux) 
{} 
0
MuxPath::MuxPath(const uint& Clk_sel, const uint& Lane_sel, const VisaMux& Mux) 
     : mux(Mux) 
    { 
     clk_sel = Clk_sel; 
     lane_sel = Lane_sel; 
    } 

「初期化リスト」と呼ばれます。

MuxPath::MuxPath(const uint& Clk_sel, const uint& Lane_sel, const VisaMux& Mux) 
    :clk_sel (Clk_sel),lane_sel(Lane_sel),mux(Mux) 
{ //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ it's called initialization-list 

} 

実際には、あなたのコードでは、すべてのメンバ変数がmuxを意味し、それぞれのコンストラクタ、のではなく、割り当てを使用しますようにコンストラクタで

0
class MuxPath { 
    MuxPath(const uint& Clk_sel, const uint& Lane_sel, const VisaMux& Mux) 
    : clk_sel(Clk_sel), lane_sel(Lane_sel), mux(Mux) {}; 
    ... 
}; 
5

使用メンバー初期化リストのコンストラクタに入る前でさえ、のデフォルトのコンストラクタで構築しようとします。 VisaMuxにはデフォルトコンストラクタがないので、そのコンパイルエラーが発生します。

したがって、mux(Mux)の構文がVisaMuxというコピーコンストラクタを呼び出すinitialization-listを使用すると、存在しないVisaMuxのデフォルトコンストラクタの呼び出しを回避できます。 muxはすでにコピーが構築されているので、の割り当てをコンストラクタ本体に使用する必要はありません。

0

あなたは一種のあなたが最初の間柱をインストールすることなく、あなたの家の中に赤い壁を得ることができますどのように求めています。 クラスにMux変数が含まれている場合は、その作成中のある時点で、タイプMuxの変数をインスタンス化する必要があります。これは、タイプMuxのインスタンスが作成されることを意味し、それを行う唯一のメカニズムはコンストラクター・コールによるものです。

これは、デフォルトの、または引数なしのコンストラクタ、コピーコンストラクタ、または他の引数をとるコンストラクタのいずれかです。他の答えは、メンバー初期化リストでそれを行う方法を示しています。しかし、ある時点でMuxのコンストラクタを呼び出す必要があるという事実を回避する方法はありません。

関連する問題