2017-09-06 4 views
1

다음은 수업입니다.선언 시간에 멤버 개체를 초기화하는 방법은 무엇입니까?

class Checker 
{ 
public: 
    Checker(); 
    ~Checker(); 

private: 
    MapFileParser m_MapParser; //MapFileParser::MapFileParser(const char* path) 

}; 

다른 클래스를 선언 할 때 클래스 멤버 개체를 초기화하는 방법이 있습니까? MapFileParser 클래스에는 MapFileParser::MapFileParser(const char* path)과 같은 서명이있는 생성자가 하나만 있습니다. 하지만 그것이 반원 일 때 나는 초기화 할 수 없다. 그래서 나는 항상 Checker 클래스의 생성자에 MapFileParser 회원을 초기화합니다.

+0

번역 중 해당 경로를 알고 계십니까? 내가 적용되지 않을 수도 있다는 것을 깨달았을 때 나는 같은 대답을 쓰고 있었다. – StoryTeller

+0

"번역 도중"이라고 말하면 컴파일 시간에 의미합니까? – HelloWorld

+0

예. 번역은 C++ 표준이 사용하는 것입니다. 구현에 의존하지 않습니다. – StoryTeller

답변

1

사용할 수

  1. 최강 부재 초기화 구문 멤버 변수를 초기화하는 (에만 가능 C++를 11 이상).

    MapFileParser m_MapParser = MapFileParser("some sensible file name"); 
    
  2. 멤버 변수를 초기화하는 초기화 프로그램 목록 구문.

    Checker::Checker() : m_MapParser("some sensible file name") { ... } 
    

는 최강의 멤버 초기화 구문은 하나 이상의 생성자가있는 경우에만 도움입니다. 하나의 생성자가있는 경우 기능 손실없이 이니셜 라이저 목록 구문을 사용할 수 있습니다.

여러 생성자가 있고 C++ 11 이상의 컴파일러를 사용할 수있는 경우 위임 생성자를 사용하여 코드 복제를 줄일 수 있습니다. 코멘트에서


, 당신은 말했다 :

내가 MapFileParser의 경로를 통과 할 검사기()의 CONST의 char *와 검사기 (CONST의 char * 경로)에 매개 변수 무효가 해결됩니다 .

이 경우 유일한 해결책은 멤버 초기화 목록을 사용하여 멤버를 초기화하는 것입니다.

Checker::Checker(char const* path) : m_MapParser(path) { ... } 
2

C++ 11에서 default member initializer을 사용할 수 있습니다.

class Checker 
{ 
    ... 
    MapFileParser m_MapParser{"something"}; 
    // or 
    MapFileParser m_MapParser = MapFileParser("something"); 
}; 

C++ 11 전에 당신은

회원 초기화리스트는 이러한 개체의 기본이 아닌 초기화가 지정할 수있는 곳입니다 member initializer list을 사용해야합니다.

class Checker 
{ 
public: 
    Checker() : m_MapParser("something") {} 
    ... 
private: 
    MapFileParser m_MapParser; 
}; 
+0

고맙지 만 11시 이전에는 어땠습니까? – HelloWorld

+0

@HelloWorld - 운이 없네 – StoryTeller

+0

@HelloWorld Answer revised. – songyuanyao