2014-11-08 3 views
0

Java에서 온 것입니다. 기본 클래스 생성자 (또는 super())를 호출하는 것에 대해 약간 혼란 스럽습니다. 나는 플레이어 (추상 클래스)과 HumanPlayer의 두 클래스가 있습니다. 지금C++에서 하위 클래스의 기본 클래스 생성자를 호출합니다.

Player(string name, list<Point> points); 

이 종류의 것을 구현하려고 메신저 : 지금, 나는 선언 플레이어에 대한 생성자가이 구문의로 힘든 시간을 보내고, C++에

HumanPlayer() { 
    string name = get name from user... 
    list<Point> points = get points from user... 
    ... 
    ... 
    ... 
    super(name, points); 
} 

정말 새를 . 안부,

+0

[이 질문] (http://stackoverflow.com/questions/120876/c-superclass-constructor-calling-rules)을 확인하십시오. 올바른 구문을 제공해야합니다. – Nemesis

+0

나는 그랬다. 하지만 자식 생성자를 구현하기 전에 super 생성자를 호출해야합니다. 나에게 도움이되지 않는다 –

+0

'super()'대신'Player (name, points);'를 사용할 수 있습니까? – Nemesis

답변

2

파생 클래스의 기본 초기화하는 유일한 방법은 생성자의 초기화 목록에 있습니다. 콜론 다음 함수 몸체 앞에있는 것입니다. 다른 방법이 없습니다 NORMAL 방법이 있습니다. 예를 들어베이스의 기능을 ") (초기화 '도입 - 당신이 정말로 생성자의 몸"의 "베이스를 초기화해야하는 경우

HumanPlayer() : 
     Player("...", list_of_points) 
{ 
... 
} 

은 목록에없는, 당신은 당신의 코드를 수정해야 클래스 또는 "pimpl 관용구"를 사용하여.

+0

"코드를 수정해야합니다. 예를 들어 기본 클래스에"initialize() "함수를 사용하거나"pimpl idiom "을 사용하여 코드를 수정해야합니다. ... 또는 디자인을 수정하십시오. – edmz

0

(가) "... 사용자의 이름을 가져올 수"와 "사용자의 포인트를 얻을이 ..."비트가 매우 간단하고 단순한 표현 또는 함수로 구현 될 수 호출하는 경우 :

HumanPlayer() 
    : Player("get name from user... code", 
      "get points from user... code") 
{ 


} 

하면, 반면에, "get"비트는 중요하지 않고 상호 의존성이 있습니다. 그러면이 비트는 좀 더 복잡해집니다. 이런 일에 대한 일반적인 접근 방식에 대한 간략한 개요는 : 기본 매개 변수 값을 남용하는 것은 생성자에서 사용되는 오브젝트를 인스턴스화 :

class HelperClass { 

public: 

    std::string name; 
    std::list<Point> points; 

    HelperClass() 
    { 
     // The constructor here will do whatever is needed to initialize name and points 
    } 
}; 


// ... 

HumanPlayer(const HelperClass &helper=HelperClass()) 
: Player(helper.name, helper.points) 
{ 
} 

일부는있을 다소 틱 해킹이를 찾을 수 있습니다. 그러나 그것은 효과적이다. 최소한 C++ 11 표준을 지원하는 C++ 컴파일러를 사용하는 경우 다른 방식으로이 방법을 약간 더 잘 수행 할 수 있습니다.

관련 문제