C ++: вызов другого метода для аргумента метода по умолчанию - PullRequest
2 голосов
/ 27 февраля 2012

Я играю с аргументами по умолчанию для своего класса 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

Как я могу сказать компилятору использовать текущий экземпляр (который доступен через this ) объекта Setting для получения значения по умолчанию? Кстати, это разрешено?

Ответы [ 3 ]

3 голосов
/ 27 февраля 2012

У вас есть два хороших варианта.Во-первых, предположим, что -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 голос
/ 27 февраля 2012
  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. Это хорошая практика перегрузки методов.Я думаю, что ваш первый пример выглядит лучше и проще, чем другой со значением по умолчанию.

1 голос
/ 27 февраля 2012

Метод getCurrentUserID() не является статичным, поэтому его можно вызывать только через объект. Один из вариантов - создать 2 метода, как показано ниже, и вызвать тот, который вам нужен:

int setSetting(int value);

int setSetting(int value, int user_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!
}
...