2012-10-15 3 views
1

템플릿 클래스 Triple을 구현했습니다.이 템플릿은 세 가지 유형을 모두 담고있는 컨테이너입니다. 내 문제는, 내 클래스는 매개 변수로 값에 대한 세 가지 const 참조를 소요하고 값은 개인 (정의)해야하지만, 또한 복사 생성자 및 오버로드 된 할당 연산자를 구현해야합니다.C++ 템플릿 클래스 복사 생성자 및 할당 연산자

template <typename T1, typename T2, typename T3> 
    class Triple 
{ 
public: 
    Triple() 
    { } 
    Triple(const T1 &a, const T2 &b, const T3 &c) : a(a), b(b), c(c) 
    { } 

    // copy constructor 
    Triple(const Triple &triple) { 
     a = triple.first(); 
     b = triple.second(); 
     c = triple.third(); 
    } 

    // assignment operator 
    Triple &operator=(const Triple& other) { 
     //Check for self-assignment 
     if (this == &other) 
      return *this; 

     a = other.first(); 
     b = other.second(); 
     c = other.third(); 

     return *this; 
    } 

    private: 
    T1 const& a; 
    T2 const& b; 
    T3 const& c; 
}; 

어떻게 변수에서 const 지정하지 않고 복사 생성자와 대입 연산자를 구현하는 것이? 당신은 (일반적으로)이 객체의 수명이 거의 확실 유형을 사용해야 개체, a, bc의 수명보다 더 오래 갈 것이라는 점을 알 수 없기 때문에

+1

할당 연산자의 문제점은 const가 아니기 때문에 * 아닙니다 *입니다. 그것은 참조가 생성 될 때 (즉, 생성자의 초기화 목록에있는) 초기화되어야하고 나중에 변경할 수 없기 때문입니다. 대입 연산자 *는 이미 완전히 생성 된 객체를 변경합니다. – JohnB

답변

4

당신은 아마 구성원으로 const를 참조를하지 말았어야 Tx하지 Tx const& .

당신이 알고을 경우 (당신이 있는지 확인하십시오, 그것은 당신이 전문가 C++ 개발자하지 않는 한 의미를 이해하지 않는 것이 더 가능성있어), 당신은 초기화 목록을 사용하여 복사 생성자를 가질 수 있습니다 .

Triple(const Triple& other) { 
    : a(other.a) 
    , b(other.b) 
    , c(other.c) 
{ } 
하여 참조, 당신은 포인터 참조를 시뮬레이션 할 수 있지만, 나는 이것이 당신은 내가 철자하지 않습니다 원하는 아니라고 생각부터하지 개체 언급 변하는 참조에 할당하기 때문에 당신은 할당 연산자를 가질 수 없습니다

아웃. 진짜 당신이을 일을해야 어떤 경우

std::tuple을 사용하고 바퀴를 개혁하지 않습니다.

관련 문제