C ++:在类中使用静态成员函数

时间:2014-04-05 17:59:34

标签: c++ function class static member

我必须创建一个类,在构造函数中,我在创建实例之前验证参数。

为此,我想在类中创建一个静态成员函数,稍后可以使用它来验证用户输入(这就是为什么它需要是静态的)。

所以看起来有点像这样:

//.h
...
public:
    Constructor(const int thing);
    static bool validateThing(int &thing);
...

//.cpp
Class::Constructor (const int &thing):
m_thing = thing;
{
    PRECONDITION(validateThing(thing));
    // the PRECONDITION macro refers to a homemade function that throws an error
    // if the bool in argument is false
}
...

// Later on, in the main file
...
cout << "Enter the thing" << endl;
int thing;
cin >> thing;

cout << "This thing is ";
if (!Class::validateThing(thing))
{
    cout << "not ";
}
cout << "valid." << endl;
...

当我尝试构建类时,我收到以下错误消息:

no matching function for call to 'Class::validateThing(int &thing)'

我应该了解什么才能使这项工作?

2 个答案:

答案 0 :(得分:1)

进行以下更改:

//.h
public:
    Constructor(int thing);
    static bool validateThing(int thing);

//.cpp
Class::Constructor(int thing): m_thing(thing)
{
    PRECONDITION(validateThing(thing));
    //etc.
}

bool Class::validateThing(int thing)
{
    //implement here
}

您似乎没有提供validateThing的实施。您还应该确保声明和定义在参数类型(const /非 - const,参考等等方面达成一致)并正确初始化成员。

构造函数和validateThing之类的函数应该使用const&个参数。但对于像int这样的简单类型,您也可以按值传递。

答案 1 :(得分:0)

不要像@iavr建议的那样删除const说明符,只需在const函数的规范中添加validateThing,如下所示:

//.h
...
public:
    Constructor(const int thing);
    static bool validateThing(const int &thing);
...

不要忘记实施validateThing功能。

IMO详尽使用const说明符是一个很好的设计。知道并且通常非常重要的是某些功能不会改变其论点是很好的。当我们使用契约式设计时我们必须关注内部和允许的类状态。