我必须创建一个类,在构造函数中,我在创建实例之前验证参数。
为此,我想在类中创建一个静态成员函数,稍后可以使用它来验证用户输入(这就是为什么它需要是静态的)。
所以看起来有点像这样:
//.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)'
我应该了解什么才能使这项工作?
答案 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
说明符是一个很好的设计。知道并且通常非常重要的是某些功能不会改变其论点是很好的。当我们使用契约式设计时我们必须关注内部和允许的类状态。