2012-11-27 2 views
0

'전환'모드를 쉽게 켜고 끌 수있는 클래스를 작성 했으므로 조금 혼란 스럽습니다. 오버로드 된 연산자 = 다른 클래스에서 복사하려면 T 구성원 m_Mode에 대한 액세스 권한이 부여됩니다. 왜 이런 일이 발생합니까? 그것 sandard, 또는 아마도 컴파일러 버그? 이 인스턴스 클래스의에하지의 클래스에 개인의클래스 참조가 전용 멤버에 대한 액세스 권한을 부여합니다.

template<class T> 
class CFixedMode 
{ 
private: 
    T m_Mode; 
public: 
    CFixedMode() 
    { 
     m_Mode = static_cast<T>(0); 
    } 
    ~CFixedMode(){} 
    void   SetMode(T mode); 
    void   SetNotMode(T mode); 
    BOOL   IsMode(T mode); 
    CFixedMode<T>&    operator=(const CFixedMode<T>& rFixedMode); 
}; 

template<class T>void CFixedMode<T>::SetMode(T mode) 
{ 
    m_Mode |= mode; 
} 
template<class T>void CFixedMode<T>::SetNotMode(T mode) 
{ 
    m_Mode &= (~mode); 
} 
template<class T>BOOL CFixedMode<T>::IsMode(T mode) 
{ 
    return ((m_Mode & mode) == mode) ? TRUE : FALSE; 
} 
template<class T>CFixedMode<T>& CFixedMode<T>::operator =(const CFixedMode<T>& rFixedMode) 
{ 
    if(typeid(m_Mode) == typeid(rFixedMode.m_Mode)) 
     m_Mode = rFixedMode.m_Mode; 
    return *this; 
} 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    CFixedMode<DWORD> Mode; 
    DWORD rMode = 0x00000010; 
    Mode.SetMode(rMode); 

    CFixedMode<DWORD> Mode2; 
    Mode2 = Mode; 
    if(Mode2.IsMode(0x00000010)) 
    { 
     //cout << Mode2.m_Mode; //c2248 
     cout << "True" << endl; 
    } 

    typeid(Mode).before(typeid(CFixedMode<DWORD>)); 

    return 0; 
} 
+1

'연산자 ='는 T와 동일한 유형 만 허용합니다. 즉, 동일한 클래스이므로 private 멤버에 대한 액세스 가능성이 있습니다. – chris

+0

그래서'typeid' 전체가 필요하지 않습니다. 그렇다면 그것은 표준의 권리입니까? –

+2

매개 변수에 대해 동일한 템플리트 인스턴스화 만 수락하므로'typeid' 비교가 항상 참이어야합니다. – chris

답변

1

개인을 의미합니다. Private은 구현 세부 사항을 숨기는 데 사용되므로 동일한 유형의 객체가 다른 객체의 private 멤버에 액세스 할 수 있다는 것은 의미가 있습니다. 다른 객체는 동일한 구현을 가지므로 세부 사항을 숨길 필요가 없습니다.

그건 그렇고, 당신의 운영자는 자기 할당을 확인해야합니다. (또는 Chris가 지적했듯이 복사 및 스왑 숙어를 사용할 수 있습니다.) 그리고 typeid로 유형을 확인할 필요가 없습니다.

+0

흠 실제로 이것이 과부하 된 운영자에게'const'가 때때로있는 이유를 설명합니다 –

+0

또는 복사 - 스왑을 구현하는 것을 고려할 수 있습니다. – chris

+0

@ViniyoShouta 여기서 const가 어떻게 작동하는지 잘 모르시겠습니까? const는 const 값이나 참조에서 연산자를 수행 할 수 있기를 원할 때 오버로드 된 연산자와 함께 사용됩니다. 예를 들어,'const Obj a = ...; Obj b = ...; Obj c = a + b;'const 연산자 +가 정의되지 않은 경우 컴파일러가되지 않습니다. – Corbin