2013-03-15 4 views
0

이 스레드를 호출하는 방법을 알지 못했습니다. 상황은 다음과 같습니다. 내가 class Boxes의 개체를 잡고, Array<T>에서 파생 된 특수 클래스를 작성하고 싶습니다 지금C++ 템플릿에서 파생 된 클래스가 템플릿의 생성자를 호출하는 방법은 무엇입니까?

template <typename T> class Array{ 
private: 
    T* m_cData; 
    int m_nSize; 
    static int s_iDefualtSize; 
public: 
    Array(); 
    Array(int nSize); 
} 

: 나는 템플릿 클래스 Array<T>

class Boxes{ 
private: 
    double m_dFull; 
public: 
    Boxes(double dFull=0): m_dFull(dFull) {} 
}; 

을 내가 할 그 다음과 같은 방법으로 :

class BoxesArray : public Array<Boxes>{ 
public: 
    BoxesArray() : Array<Boxes>::Array() {} 
    BoxesArray(int nValue) : Array<Boxes>::Array(nValue) {} 
} 

그리고 난 단지 Boxes을 의미하는 일부 추가 기능을 추가합니다. 좋아, 여기 혼란 넘버 원이 온다. ArrayBoxes()을 호출하면 개체 배열을 인스턴스화하고이 개체를 Box를 보관하기 위해 "준비"하는 것처럼 보입니다. 그러나 생성 후 오브젝트 ArrayBoxes이 Boxes로 이미 채워지는 것은 어떻게됩니까 (위 코드의 어느 부분)? 그리고 두 번째 질문은 ArrayBoxes를 채우는 상자가 Boxes의 기본 생성자 (상자 m_dFull이 0으로 설정 됨)를 사용하여 생성된다는 것을 알 수 있습니다. 그러나 ArrayBoxes가 기본적으로 Boxes의 매개 변수 생성자를 사용하여 인스턴스화되도록하려면 어떻게해야합니까? (예를 들어 Box m_dFull = 0.5)? 희망하는 모든 편집 내 질문에 지금은 분명하다.

+0

부모 클래스의 기본 생성자를 호출 할 필요가 없으며 암시 적으로 호출됩니다. – mfontanini

+0

'Array '의 기본 생성자는 무엇을합니까? 우리가 볼 수 있을까요? 상속의 의미에 대해 명확하지 않은 것처럼 들립니다. 'ArrayBoxes'는'Array '이므로,'Array '기본 생성자에서했던 것은'ArrayBoxes'에 영향을 미칩니다. – andre

+0

'Array :: Array()'에 인수가없는 것을 감안할 때 왜'ArrayBoxes() {}'가 작동하지 않는지 이해하기 위해 늘고 있습니다. – WhozCraig

답변

0

당신은 당신의 기본 생성자의 본문에 귀하의 요구 사항을 충족 Boxes와 배열을 채우기 위해 코드를 삽입하거나 회원에서 당신이 할 Boxes 인스턴스를 취 Array<Boxes>의 기본이 아닌 생성자를 호출해야합니다 초기화리스트.

0

하지만 어떻게 일어나는가 (즉, 어떤 위의 코드의 일부) ArrayBoxes를 생성하고 객체 후 나는 그것이 박스로 이미 작성했다고?

BoxesArray 생성자가 Array<Boxes> 생성자를 호출하는 것처럼 보입니다. 그렇지 않은 경우에도 C++이 암시 적으로 호출합니다. 내가 인스턴스화 할 ArrayBoxes을 좋아하면

그리고, 두 번째 질문, 나는 박스의 기본 생성자를 사용 ArrayBoxes을 채우기 이러한 박스가 구성되어 있는지 (박스 m_dFull 0으로 설정되고있다)하지만 무엇을 볼 수 있습니다 상자의 파라 메트릭 생성자를 사용하는 기본값 (예 : 상자 m_dFull = 0.5)?

당신은 Array<T>에과 같이 생성자를 추가해야합니다 : 당신 내부 Array(int nsize, double defval);

은 상자의 기본값을 호출하여 배열을 구성합니다.

관련 문제