C ++:为默认方法参数调用另一种方法

时间:2012-02-27 10:35:25

标签: c++ dynamic methods default-value overloading

我正在我的项目中使用我的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 获得)来获取默认值? 顺便说一下,这是授权吗?

3 个答案:

答案 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)

  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() ); 
    };
    
  2. 在C ++中应避免使用默认参数值,以免使代码复杂化。

  3. 重载方法是一种很好的做法。 我认为你的第一个例子似乎看起来更好更简单,另一个例子具有默认值。