-1

重み付けスキームのクラスを実装し、クラス内に異なる数のパラメーターを持つ 4 つのコンストラクターを作成しました。特定のコンストラクターのパラメーターを使用してコンストラクターを呼び出そうとすると、パラメーターのないデフォルトのコンストラクターも呼び出されます。なぜこのようなことが起こっているのかを理解してください。

コンストラクターの定義:

593     UnigramLMWeight(double param_log_,int select_smoothing_,double param_smoothing1_,double param_smoothing2_)
594         : select_smoothing(select_smoothing_), param_log(param_log_), param_smoothing1(param_smoothing1_),
595           param_smoothing2(param_smoothing2_)
596         {

コンストラクターの呼び出し:

 79     enquire.set_weighting_scheme(Xapian::UnigramLMWeight(double(322.0),int(2),double(2000.0),double(2.0)));

しかし、設定されている値がデフォルトのコンストラクターからのものであることを確認しました。

なぜこのデフォルトコンストラクタが呼び出されるのか、またはパラメトリックコンストラクタの後にデフォルトコンストラクタが呼び出されるか、パラメータが他の型にキャストされ、コンストラクタがそのようなコンストラクタを見つけようとするが、そのようなコンストラクタを見つけることができず、デフォルトコンストラクタを呼び出すたびに最後に。

set_weigthing スキームのコードは次のとおりです。

 926 Enquire::set_weighting_scheme(const Weight &weight_)
 927 {
 928     LOGCALL_VOID(API, "Xapian::Enquire::set_weighting_scheme", weight_);
 929     // Clone first in case doing so throws an exception.
 930     Weight * wt = weight_.clone();
 931     swap(wt, internal->weight);
 932     delete wt;
 933 }

set_weighing スキームの set メソッドは clone 関数を呼び出しますか? これは、デフォルトのコンストラクタを複製するときに問題の根本原因となりますか? それが理由でしょうか?

4

1 に答える 1

2

オブジェクトのコピー (クローン?) を作成すると、コピー コンストラクターが呼び出されます。カスタム コピー コンストラクターを実装していないようです。そのため、コンパイラーによって生成されたデフォルトのコンストラクターが代わりに呼び出されます。

UnigramLMWeight(const UnigramLMWeight& copy_from)
{
// implement copy here
}

http://login2win.blogspot.com/2008/05/c-copy-constructor.htmlが役立つ場合があります

于 2012-05-21T18:42:50.923 に答える