2012-05-21 129 views
-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方案集合方法调用克隆功能,做到这一点是问题的根本职高当克隆默认构造函数被调用,是这样吗? 这是理由吗?

+4

HM,你想用什么语言用的? C#,C++和C是相当不同的。它不能是C(因为你正在说对象),'''在'正常'的C#代码中很少见......我怀疑你想要C++,但是你的标签很难告诉 – Crisfole

+5

请提供一个完整的,最小的示例程序来演示问题。 –

+0

@ChristopherPfohl其C++抱歉,更正了标签...对不起,最初添加这些标签 – samuelhard

回答

2

当您制作对象副本(克隆?)时,复制构造函数被调用。 似乎你还没有实现一个自定义拷贝构造函数,所以调用编译器生成的默认拷贝构造函数。

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

http://login2win.blogspot.com/2008/05/c-copy-constructor.html可能会有所帮助

+0

是的,我没有实现复制构造函数,但它将如何有所作为将使用默认的复制构造函数和默认的复制构造函数会做明智的复制参数值应该是相同的。当复制构造函数可能会发生调用默认的构造函数....但我认为实现复制构造函数是一个很好的尝试将实现,看看它是否可以解决问题 – samuelhard

+0

我的克隆函数的类有一个实现,在其他文件中调用默认构造函数,所以每次它是稍后设置克隆默认构造函数被调用....因此值是默认构造函数..... – samuelhard

+0

感谢您的回答,probl EM解决了,重新实现了克隆功能 – samuelhard

相关问题