我正在我的项目中使用我的Settings类的默认参数,因此我声明的方法少了一些。
例如,我声明了这些方法:
class Settings
{
// [..]
int getCurrentUserID(); // returns current user id
// you specify the user id
int setSetting( int value, int user_id );
// no user specified, use the current one, overloads the previous when called
// with only 1 argument
int setSetting( int value );
}
我想要的是这个简化版本:
class Settings
{
// [..]
int getCurrentUserID(); // returns current user id
// automatically selects the current user if no ID is provided
int setSetting( int value, int user_id = getCurrentUserID() );
}
但是我在编译时遇到了这个错误:
cannot call member function ‘int Settings::getCurrentUserID()’ without object
我怎么能告诉编译器使用Setting对象的当前实例(可以通过 this 获得)来获取默认值? 顺便说一下,这是授权吗?
答案 0 :(得分:3)
你有两个不错的选择。首先,假设-1
不是合法的user_id
:
class Settings
{
// [..]
int getCurrentUserID(); // returns current user id
// automatically selects the current user if no ID is provided
int setSetting( int value, int user_id = -1);
};
int Settings::setSetting( int value, int user_id )
{
if(user_id == -1) user_id = getCurrentUserID();
...
可替换地:
class Settings
{
// [..]
int getCurrentUserID(); // returns current user id
int setSetting( int value ) { return setSetting(value, getCurrentUserID() ); }
int setSetting( int value, int user_id );
};
答案 1 :(得分:1)
方法getCurrentUserID()
不是静态的,因此您只能通过对象调用它。一种选择是创建2个方法,如下面的方法,这个并调用你需要的方法:
int setSetting(int value);
int setSetting(int value, int user_id);
另一种选择:假设ID始终为正,您可以在方法上给出默认的否定ID,并在方法内部验证是否使用ID调用该方法。像这样:
int setSetting(int value, int user_id = -1) {
if (user_id == -1) {
this->setSetting(value, this.getCurrentUserID());
return 0; //don't know what the function returns, but handle it the way you need
}
// rest of the function will be called recursively, but it's OK
// because the ID is not -1!
}
答案 2 :(得分:1)
只能使用静态方法作为默认参数值。此示例有效(已验证):
class Settings
{
// [..]
static int getCurrentUserID(); // returns current user id
// automatically selects the current user if no ID is provided
int setSetting( int value, int user_id = getCurrentUserID() );
};
在C ++中应避免使用默认参数值,以免使代码复杂化。
重载方法是一种很好的做法。 我认为你的第一个例子似乎看起来更好更简单,另一个例子具有默认值。