尝试编写一个简单的指数过滤器类,它本身包含在.h文件中。我得到这些错误:
- 类"不存在默认构造函数;ExpoFilter
- 冲突声明"ExpoFilter alpha_temp">
我不理解这个问题,我有两个构造函数,一个用于int类型参数,一个为float类型参数。这不足以被认为是两个不同的函数签名吗?
我还从第二个构造函数中调用了第一个构造函数,这在过去已经成功地完成了。还尝试了正确的完整.cpp+.h文件,但没有成功。
那么怎么了?
这是代码:
/*
Exponential filter, a.k.a exponential moving average, object Class
*/
#ifndef ExpoFilter_h
#define ExpoFilter_h
class ExpoFilter
{
// user-accessible "public" interface
public:
// Constructors
ExpoFilter::ExpoFilter(float alpha){
_alpha = alpha;
_alpha2 = 1.0f - _alpha;
}
ExpoFilter::ExpoFilter(int N){
float alpha_temp = 2.0f / (N + 1);
ExpoFilter(alpha_temp);
}
ExpoFilter::operator float(){
return _value;
}
float ExpoFilter::operator=(float newValue)
{
return NewValue(newValue);
}
float ExpoFilter::NewValue(float newValue){
_value = newValue * _alpha + _value * _alpha2;
return _value;
}
// library-accessible "private" interface
private:
float _alpha;
float _alpha2;
float _value;
};
#endif
问题是,由于类ExpoFilter
有一个参数化构造函数,编译器将不会自行合成默认构造函数ExpoFilter::ExpoFilter()
。这意味着,如果您想使用默认构造函数创建/构造类ExpoFilter
的对象,例如通过编写ExpoFilter alpha_temp;
,那么编译器将产生错误,因为没有默认构造函数。
要解决问题,您必须为类添加一个默认构造函数,如下所示:
class ExpoFilter
{
//other code here as before
//default constructor that uses constructor initializer list
ExpoFilter() : _alpha(0), _alpha2(0), value(0)
{
}
}
现在,当你写道:
ExpoFilter(alpha_temp); //this creates a temporary object named alpha_temp using the default constructor
上面的语句使用默认构造函数创建一个名为alpha_temp
的ExpoFilter
类型的对象。但是由于编译器没有合成默认的ctor,您将得到上述错误。
如果您打算调用参数化构造函数而不是默认构造函数,那么您可以将上面的语句更改为:
ExpoFilter(2.0f / (N + 1));
"默认构造函数"在这种情况下,意味着一个不带参数的构造函数,即
ExpoFilter() {...}
您有一个接受int参数的构造函数和一个接受float参数的构造函数,但没有一个不接受参数的构造函数。所以代码是这样的:
ExpoFilter alpha_temp;
无法编译,因为编译器不知道如何在没有提供参数的情况下构造对象。
顺便说一句,这行:
ExpoFilter(alpha_temp);
没有在对象上调用构造函数方法;相反,它是在构建第二个(临时/匿名(ExpoFilter
对象,该对象在堆栈上创建,然后立即销毁——可能不是您想要的。(特别是,这一行不会更改原始ExpoFilter
对象的状态!(。如果你想从你的构造函数中委托给另一个构造函数方法(并且你是用C++11或更新版本编译的(,你需要从构造函数的初始值设定项列表中调用其他构造函数:
ExpoFilter::ExpoFilter(int N)
: ExpoFilter(2.0f / (N + 1))
{
// ...
}