2014-10-29 4 views
1

저는 C++에서 클래스 선언과 정의를 별도로 유지하려고합니다. 나는 '파생 정의 할 경우, 지금 즉,기본 클래스 생성자에 매개 변수 전달 C++

# Base.c 
Base::Base(int x) 
{ 
    n = x; 
} 

# Base.h 
class Base 
{ 
    int n;  
public: 
    Base(int x); 
}; 

을하고 CPP 파일에 생성자 구현을 정의 : 그래서, 다음과 같이 헤더에 나는'기본 '클래스를 정의 할 수 있습니다 다음과 같이 기본 '클래스'는 상속 클래스는 '나는 기본 클래스에 매개 변수를 전달할 수 있습니다 :

#Derived.h 
class Derived : public Base 
{ 
    int t; 
public: 
    Derived(int y) : Base(t) {t = y;} 
} 

을하지만 이런 식으로 일을하는 것은 내가 헤더 파일에 파생 클래스의 생성자의 몸을 배치하는 것이 필요 , 즉 {t = y;}이며, 따라서 생성자 정의가 더 이상 선언과 분리되어 있지 않습니다. 클래스의 기본 클래스 생성자에 인수를 전달하여 cpp 파일에서 파생 클래스의 생성자를 정의 할 수있는 방법이 있습니까?

답변

3

헤더 파일,이 예 :

class Derived : public Base 
{ 
    int t; 
public: 
    Derived(int y); // Declaration of constructor 
}; 

cpp가 파일에있는 동안 :

Derived::Derived(int y) : Base(t) { // Definition of constructor 
    t = y; 
} 

Member initializer lists 인라인에서뿐만 아니라 클래스 생성자의 정의에 사용할 수 있습니다 클래스 정의. 궁금한 점이 있다면 초기화 순서와 컴파운드 생성자 본문을 실행하기 전에 멤버가 초기화된다는 사실에 대한 두 가지 작은 경고에 대해서는 cppreference을 살펴 보는 것이 좋습니다.

3

cpp 파일에서 파생 클래스의 생성자를 정의 할 수있게 해주는 클래스의 기본 클래스 생성자에 인수를 전달하는 방법이 있습니까?

물론 있습니다. 헤더는 당신이 Base 위해 한대로 정확하게 생성자를 선언 할 수 있습니다 : 당신이 Base을 위해했던 것처럼

class Derived : public Base 
{ 
    int t; 
public: 
    Derived(int y); 
}; 

후 정확하게, 소스 파일에서 그것을 구현할 수 있습니다

Derived::Derived(int y) : Base(y), t(y) {} 

주 당신 ' (아직 초기화되지 않은) 멤버 t이 아닌 기본 생성자에 인수 y을 전달해야합니다. 기본 하위 객체는 항상 멤버보다 먼저 초기화됩니다.

+0

물론 simples ;-) –

관련 문제