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&
参数。但是对于像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++:在类中使用静态成员函数的主要内容,如果未能解决你的问题,请参考以下文章