2010-06-11 7 views
0

내 코드 : 모두 분명히생성자 과부하 문제 C++에서 상속 여기

Request: Hello World 
LoginRequest: Hello World with QDomDocument 
Request: Hello World 
LoginRequest: Hello World 

: 오버라이드 LoginRequest

LoginRequest *test=new LoginRequest(doc); 

의 호출 생성자 나는이 결과를 내놓았다

class Request 
{ 
public: 
Request(void); 
……….. 
} 

Request::Request(void) 
{ 
qDebug()<<"Request: "<<"Hello World"; 
} 


class LoginRequest :public Request 
{ 
public: 
LoginRequest(void); 
LoginRequest(QDomDocument); 
…………… 
} 

LoginRequest::LoginRequest(void) 
{ 
qDebug()<<"LoginRequest: "<<"Hello World"; 
requestType=LOGIN; 
requestId=-1; 
} 

LoginRequest::LoginRequest(QDomDocument doc){ 
qDebug()<<"LoginRequest: "<<"Hello World with QDomDocument"; 
LoginRequest::LoginRequest();  
xmlDoc_=doc;   
} 

LoginRequest의 생성자는 REquest 생성자라고 불린다.

이 상황에 대해 어떤 방법으로도 망칠 수 있습니까?

내가하고 싶은 작업을 수행하는 다른 함수를 생성 할 수 있으며 두 생성자 모두 해당 함수를 호출 할 수 있습니다. 하지만 거기에 어떤 해결책이 있을까?

편집 : http://www.parashift.com/c++-faq-lite/ctors.html#faq-10.3

+0

왜이 상황을 처리하고 싶습니까? 두 개의 LoginRequest를 생성하고 있습니다. 분명히 그것은 당신이 2 개의 요청을 가지고 있고, 요청 ctor가 두 번 호출되어야한다는 것을 의미합니다. – MSalters

+0

사실, 하나의 LoginRequest를 만들고 싶었지만 지금은 내 잘못을 봅니다. – metdos

답변

6

코드는 사용자가 생각하는대로 수행하지 않습니다. 줄 :

LoginRequest::LoginRequest();  

즉시 파괴되는 임시 대상을 구성합니다. 다른 사람들이 제안했듯이 private 함수에 중복 코드를 넣을 수는 있지만 많은 문제가 있습니다. 특히 이러한 함수는 초기화를 수행하지 않고 할당 만 수행 할 수 있으며 많은 클래스는 할당을 지원하지 않습니다. 다소 더 나은 솔루션은 기본 인수로 하나의 생성자를 구현하는 것입니다 :

class LoginRequest { 
    .... 
    LoginRequest(QDomDocument d = DefaultDoc()); 
}; 
+0

초기화 할 수없는 이유는 무엇입니까? – metdos

+0

@metdos 초기화 이후에 (아마도) 호출되기 때문에. 두 번째 의견을 이해할 수 없습니다. –

+0

@metdos 죄송합니다 - 아직도 이해할 수 없습니다. 다른 변수를 사용하는 것처럼 변수를 사용합니다. –

2

예, 기능을 사용하고 두 생성자에서 호출하는 솔루션은 (어쩌면 더 나은 데르 : 클래스 계층 구조 요청하기 - LoginRequest - LoginRequestWithDoc을) 좋은 일입니다.

C#은 당신이 필요로하거나 달성하려고 시도했지만 C++을 제공하지 않습니다 : 클래스의 ctor가 같은 클래스의 다른 ctor를 호출합니다.

class LoginRequest 
{ 
    public LoginRequest() 
    { 
    // ... 
    } 

    public LoginRequest(Document doc) 
    : this() // <<< order of execution: Request() -> LoginRequest() 
       //       -> LoginRequest(doc) 
    { 
    // ... 
    } 
} 
+0

C++ 0x에 있지만. –

1

나는 내가 두 생성자가 그 함수를 호출해야 할 일을 다른 기능을 구성 할 수 있습니다. 하지만 거기에 어떤 해결책이 있을까?

예, 있습니다 :

먼저, 초기화 목록에 초기화 코드를 이동합니다. 보다 효율적이고 훌륭한 코딩 방법입니다.

두 번째로 생성자와 초기화에 공통적 인 코드 (즉 초기화 목록에 넣을 수없는 코드)는 공통 개인 함수로 이동해야하며 두 생성자 모두에서 호출해야합니다.

일반적으로 다른 생성자에서 생성자를 호출하는 것은 좋지 않습니다. 컴파일러가 수행하는 작업에 따라 이상한/정의되지 않은 동작 (이 경우 기본 클래스가 두 번 초기화 됨)이있을 수 있습니다.

+1

아니요, 기본 클래스가 두 번 초기화되지 않았습니다. 완전히 다른 기본 클래스 인스턴스가 작성됩니다. –