Инициализируйте поле const в конструкторе, но сначала проверьте один параметр

Итак, это было задание, которое у меня было на тесте. Вам нужно создать класс User с const int userID, чтобы каждый объект User имел уникальный ID.

Меня попросили перегрузить конструктор 2-мя параметрами: ключ, имя. Если ключ был равен 0, то пользователь будет иметь уникальный идентификатор, иначе пользователь получит идентификатор пользователя = -1.

Я сделал это:

class User{
private:
    static int nbUsers;
    const int userID;
    char* name;
public:
    User(int key, char* name) :userID(nbUsers++){
        if (name != NULL){
            this->name = new char[strlen(name) + 1];
            strcpy(this->name);
        }
    }

};

Я не знаю, как сначала проверить, равен ли ключевой параметр 0, а затем инициализировать постоянный идентификатор пользователя. есть идеи?


person Arkenn    schedule 25.11.2016    source источник


Ответы (1)


Вы можете использовать тернарный оператор, чтобы его можно было вызывать непосредственно в список инициализации конструктора:

class User
{
private:
    static int nbUsers;
    const int userID;
    char* name;

public:
    User(int key, char* name) : userID(key == 0 ? -1 : nbUsers++)
    {
        // ...
    }
};

стандарт гарантирует, что будет оцениваться только одна из ветвей, поэтому nbUsers не будет увеличиваться, если key == 0.


Кроме того, вы можете использовать вспомогательную функцию:

int initDependingOnKey(int key, int& nbUsers)
{
    if(key == 0) return -1;
    return nbUsers++;
}

class User
{
private:
    static int nbUsers;
    const int userID;
    char* name;

public:
    User(int key, char* name) : userID(initDependingOnKey(key, nbUsers))
    {
        // ...
    }
};
person Vittorio Romeo    schedule 25.11.2016
comment
Проголосовал за, но я бы предпочел key ? nbUsers++ : -1. Также подумайте об использовании static std::atomic<unsigned> ubUsers - person Bathsheba; 25.11.2016
comment
Было бы лучше, если бы initDependingOnKey была статической функцией класса User! - person jpo38; 25.11.2016