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

Posted

技术标签:

【中文标题】C++:在类中使用静态成员函数【英文标题】:C++ : Using a static member function within class 【发布时间】:2014-04-05 17:59:34 【问题描述】:

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

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

所以看起来有点像这样:

//.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)'

要完成这项工作,我应该了解什么?

【问题讨论】:

您将const int 传递给需要非常量 int reference 的函数是否有特殊原因?预条件参数 ?并且您可能希望在发布错误内容时指定报告错误的位置(这比大多数人所做的要多,所以至少您可以这样做)。 @WhozCraig:对于 const int,我最终做了 rzymek 所说的,所以所有涉及的参数都是 const。至于指定错误报告的位置,我会在以后的问题中记住这一点。感谢您的反馈:) 【参考方案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/non-const、引用等)并正确初始化成员。

构造函数和validateThing 等函数应采用const&amp; 参数。但是对于像int 这样的简单类型,您也可以按值传递。

【讨论】:

太好了,谢谢!据我所知,我试图通过引用传递一个论点,这是有害的(而且无用的),因为我并不打算修改论点,对吧?至于 validateThing 的实现,我做到了,但我认为在这个例子中提供它是没有用的(我在整个地方手动实现它的指令,所以我知道它们有效)。 @Chloro 没错。但正如我在编辑中所说,您也可以为小类型传递值。【参考方案2】:

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

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

别忘了实现validateThing函数。

IMO 详尽地使用const 说明符是一个很好的设计。很高兴知道某些函数不会改变它的参数,而且通常非常重要。当我们使用契约式设计并且我们必须关心内部和允许的类状态时,它很有用。

【讨论】:

好的,我会考虑在参数中添加 const。谢谢!

以上是关于C++:在类中使用静态成员函数的主要内容,如果未能解决你的问题,请参考以下文章

C++类中的静态成员函数以及静态成员变量

C++ 类中的静态成员变量,静态成员函数

C++类中的静态成员变量与静态成员函数的使用

C++ 静态成员函数

C++ 静态成员函数

C++ 静态成员函数