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

Хорошо, так что это была задача, которую я выполнил на своем тесте.
Вам необходимо создать класс User с const int userID, чтобы у каждого объекта User был уникальный идентификатор.

Меня попросили перегрузить конструктор двумя параметрами: ключ, имя. Если ключ был 0, то у пользователя будет уникальный идентификатор, иначе пользователь получит ID пользователя = -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, а затем инициализировать const userID.
Какие-нибудь мысли?

0

Решение

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

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))
{
// ...
}
};
5

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]