2012-01-20 2 views
1

에서 중첩 클래스를 합성하지 : 이유는 == 연산자 내가 컴파일하려고하면 자동으로 C++

class Outer 
{ 
    class Inner 
    { 
     int t; 
    }; 
public: 
    Inner inner_; 
    bool operator ==(Outer rightSide); 
}; 

bool Outer::operator ==(Outer rightSide) 
{ 
    if (inner_ == rightSide.inner_) 
     return true; 
    return false; 
} 

내가 오류가 발생

아, 내가 연산자는 == 것을 결코 실현되지 : 또는이

가 EDIT C++

의 속성입니다 합성되지 않았고, 나는 그것이 합성된다는 확신을했기 때문에, 확인하기가 번거롭지 않았다.
Parapura Rajkumar 감사합니다!

+8

'=='자동으로 합성되지 않습니다 것은 ... 이유는 내부 클래스가해야 단순히'반환 inner_ == rightSide.inner_', 예외 모든 –

+1

먼저 것, 둘째로 네, 그것은 의미가 모호하기 때문에 합성되지 않을 것입니다. – Phonon

+0

왜 컴파일러에서 암시 적 연산자를 제공하겠습니까? Cf. 이 질문에 http://stackoverflow.com/questions/217911/why-dont-c-compilers-define-operator-and-operator – Useless

답변

2

비교 연산자는 암시 적으로 생성되지 않습니다. 만 이런 일들은 다음과 같습니다 사업자

  • 기본 생성자,
  • 소멸자,
  • 복사 및 이동 생성자,
  • 복사-의 할당은 및 할당에 이동 당신이 할 수 있도록하려면

유형을 비교하려면 자체 비교 연산자를 작성해야합니다. 멤버로 구현하면 const; 그렇지 않으면 상수 개체를 비교할 수 없습니다. 불필요한 복사를 피하기 위해 인수를 상수 참조로 사용하는 것도 고려해 볼 수 있습니다. 이와 같은 단순한 유형에서는 거의 차이가 없지만 크거나 복잡한 클래스에서는 훨씬 더 효율적일 수 있습니다. 같은 뭔가 :

bool Outer::operator==(Outer const & rhs) const { 
    return inner_.t == rhs.inner_.t; 
} 

또는 비 멤버 함수로

:

bool operator==(Outer const & lhs, Outer const & rhs) { 
    return lhs.inner_.t == rhs.inner_.t; 
} 
+1

및 소멸자. –

+0

@phresnel : 고마워, 잊어 버렸다. –

+0

@phresndl 소멸자는 항상 생성됩니다 – codekiddy

1

당신은 class Inneroperator==를 정의하지 않았다. 그래서 코드가 있어야한다 :

class Outer 
{ 
    class Inner 
    { 
     int t; 
    public: 
     bool operator == (Inner inner) 
     { 
      return t == inner.t; 
     } 
    }; 
public: 
    Inner inner_; 
    bool operator == (Outer rightSide); 
}; 

bool Outer::operator == (Outer rightSide) 
{ 
    return inner_ == rightSide.inner_; 
} 
+0

감사합니다. 그것은 작동합니다. –

+0

사실, 이것은 ** 연산자 **가 어떻게 보이지만 어떻게 보이게 될지 **는 아닙니다 **입니다! _should_를 어떻게 보이는지 알기 위해서는 그것들을 비 멤버로 만들고 싶고 아마도'const &'매개 변수를 취하고 싶을 것이다.전자는 대칭 변환을 지원하고, 후자는 성능을 위해, 그리고'const' 왼손 인수에 적용 할 수 있습니다. –