2013-03-18 6 views
0

템플릿 작성 및 컴포지션 스타일 코딩에 약간의 문제가 있습니다. * this 매개 변수를 사용하여 다른 개체의 생성자 안에 개체가 만들어졌습니다. 미안, 내가 분명하지 않다면. 코드는 다음과 같습니다 다음 outer.h 파일에서사용자 정의 클래스를 매개 변수로 사용하여 템플릿 작성

다음 inner.h 파일

template<typename T> 
class inner { 
    public: 
    inner(T &name); 
    private: 
    int top; 
    int bot; 
}; 

template<typename T> 
inner<T>::inner(T &name) { 
    top = name.getLength() /2; 
    bot = -name.getLength()/2; 
} 

이 허용되는 경우 모르겠어요에서

class outer { 
    public: 
    outer(int w, int l); 
    int getWidth(); 
    int getLength(); 
    private: 
    inner<outer> test(*this); 
    int width; 
    int length; 
}; 

outer::outer(int w, int l) { 
    width = w; 
    length = l; 
} 

int outer::getLength() { 
    return length; 
} 

'내가 할 수있는 이 문제를 해결하는 온라인 자료를 찾으십시오. 컴파일러가 outer.h의 * this 문에 문제가 있습니다.

미리 도움을 주셔서 감사합니다.

+0

C++ 11로 컴파일하고 컴파일러에서 해당 기능을 지원하는지 확인하십시오. – chris

+0

@chris는'()'이 아니라'='또는'{}'만 사용합니다. – juanchopanza

+0

@ juanchopanza, 오 그래, 맞아. 어쨌든 언제든지 {}을 사용합니다. – chris

답변

3

C++ 03을 사용하는 경우 생성자에서 초기 할당을 수행해야합니다.

class outer { 
    public: 
    outer(int w, int l); 
    int getWidth(); 
    int getLength(); 
    private: 
    // Member variables are initialized in the order they are declared here. 
    int width; 
    int length; 
    inner<outer> test; 
}; 

outer::outer(int w, int l) 
    : width(w) 
    , length(l) 
    , test(*this) 
{ 
} 

편집 : Kerrek SB 또한 변수의 순서가 변경 될 필요가 있음을 관찰한다. 클래스에서 선언 한 순서대로 초기화되고 test이 마지막으로 초기화되어야하므로 다른 변수가 초기화됩니다.

+0

감사합니다. 나는 이것을 시도하고 컴파일러는 "no match to '(inner ) (outer &)'"오류를 던집니다. 그게 무슨 뜻인지에 대한 아이디어가 있습니까? – MrDiggles

+0

어떤 경우에도 정수는 시간에 초기화되지 않기 때문에 정의되지 않은 동작이됩니다. –

+0

@KerrekSB 현장 점검을 보내 주셔서 감사합니다. –

관련 문제