2016-11-20 1 views
1

는 다음과 같은 코드를 생각해초기화 객체 데이터 멤버 C++

class Game { 
private: 
    vector<SomeType*> vec; 
    OtherType obj; 

public: 
    Game(char* configuration_file); 
}; 

어떻게 하나 VEC와 OBJ 모두 configuration_file의 내용에 의존하고 있음을 고려하여 게임의 생성자를 구현해야을?

vec 및 obj를 구성하기 전에 configuration_file을 구문 분석해야하므로 초기화 목록을 사용할 수 없습니다.

constrcut vec 및 obj를 생성자 본문 내부에서 호출 할 경우 두 기본 생성자가 모두 호출되는 것보다이를 방지하는 방법이 있습니까?

이런 종류의 작업을 수행하는 일반적인 방법은 무엇입니까?

감사합니다.

+0

왜 직접 복사하지 않습니까? obj = OtherType (parsedData); 생성자 본문에 기본 생성자를 비공개로 설정하면 body 데이터를 입력하기 전에 모든 게임 데이터 멤버를 초기화해야하므로 obj 기본 생성자에 대한 호출이 발생할 것이라는 것을 이해하면 –

+0

이 컴파일되지 않습니다. 해당 호출을 저장하려고합니다. –

+0

예, 본문 생성자를 입력하기 전에 개체의 모든 기본 생성자가 호출됩니다. john zwick 솔루션이 좋다. –

답변

1

벡터를 기본적으로 구성하는 것은 무해한 것이므로 다른 유형의 기본 생성은 불가능하다고 가정 해 봅시다. 그런 다음이 방법으로 처리 할 것입니다.

class Game { 
private: 
    vector<SomeType*> vec; 
    OtherType obj; 

    static OtherType load(const char* config_file); 

public: 
    Game(const char* config_file) 
    : obj(load(config_file)) 
    { 
    // populate vec here 
    } 
}; 
+0

@Captain_Tiras : 그건 한 가지 방법 일뿐,'load()'를 구현할 수도있다. –

+0

은 정적 함수로 구현됩니다. 맞습니까? –

0

때로는 사람이 어디로 가는지 얻기 위해 약간의 우회로를 걸어야합니다.

첫째, 정적 개인 함수를 작성 :

std::pair<std::vector<SomeType *>, OtherType> Game::parse_config_file(char *configuration_file) 
{ 
    // ... 
} 

이 이러한 종류의 데이터로 구성 파일을 구문 분석 개인 정적 함수가 될 것입니다.

지금, 당신은 함께이 지그 소 퍼즐을 넣을 수 있습니다 :

class Game_config { 

protected: 

    vector<SomeType*> vec; 
    OtherType obj; 

    Game_config(const std::pair<std::vector<SomeType *>, OtherType> &); 
}; 

class Game : private Game_config { 

    static std::pair<std::vector<SomeType *>, OtherType> Game::parse_config_file(char *configuration_file); 

public: 
    Game(char* configuration_file) : Game_config(parse_config_file()) 
    { 
    } 
}; 

Game_config의 생성자는 명백해야한다.

의 약간의 변화 위의 parse_config_file()있는 Game_config 슈퍼 클래스를 반환하고 Game의 생성자는 슈퍼 클래스를 복사 구축해야하는 것입니다. 최신 컴파일러는이 사용 사례에서 RVO를 사용할 수 있어야합니다.