C++ : 我的类构造函数有什么问题?(不存在默认构造函数和/或冲突的声明)?



尝试编写一个简单的指数过滤器类,它本身包含在.h文件中。我得到这些错误:

  1. 类"不存在默认构造函数;ExpoFilter
  2. 冲突声明"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_tempExpoFilter类型的对象。但是由于编译器没有合成默认的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))
{
// ...
}

最新更新