2016-11-25 8 views
0

좋아요, 그래서 이것은 내 테스트에서 수행 한 작업입니다. 각 사용자 개체가 고유 한 ID를 갖도록 const int userID를 사용하여 User 클래스를 만들어야합니다.생성자에서 const 필드를 초기화하지만 먼저 하나의 매개 변수를 확인하십시오.

두 개의 매개 변수 key, name을 사용하여 생성자에 오버로드를 요청 받았습니다. 키가 0이면 사용자는 고유 한 ID를 가지며, 그렇지 않으면 사용자는 userID = -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 사용자 ID를 초기화하는 방법을 모르겠습니다. 의견이 있으십니까? 이 생성자 초기화 목록에서 직접 호출 할 수 있도록

답변

4

당신은 ternary operator 사용할 수 있습니다

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

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

standard guarantees that only one of the branches will be evaluated, 그래서 nbUserskey == 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)) 
    { 
     // ... 
    } 
}; 
+1

Upvoted을,하지만 난'키를 선호하는 것? nbUsers ++ : -1'입니다. 또한'static std :: atomic ubUsers'를 사용하는 것에 대해 생각해보십시오. – Bathsheba

+0

이제 알겠습니다. 많은 감사합니다! – Arkenn

+1

'initDependingOnKey'를'User' 클래스의 정적 함수로 사용하는 것이 더 좋을 것입니다! – jpo38