0

モードを簡単に「オン/オフ」するためのクラスを書いていたので、少し混乱しました。別のクラスからコピーするためにオーバーロードされた operator= では、プライベートTメンバーへのアクセスm_Modeが許可されていますが、これはなぜですか? それはサンダルですか、それともおそらくコンパイラのバグですか?

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;
}
4

1 に答える 1

1

プライベートとは、クラスのインスタンスではなく、クラスに対してプライベートであることを意味します。Private は実装の詳細を隠すために使用されるため、同じ型のオブジェクトが他のオブジェクトのプライベート メンバーにアクセスできることは理にかなっています。これらの他のオブジェクトの実装は同じであるため、詳細を隠しても意味がありません。

ちなみに、 operator= は自己割り当てをチェックする必要があります。(または、Chris が指摘したように、copy and swap イディオムを使用することもできます。) また、typeid で型をチェックする必要はありません。

于 2012-11-27T06:32:59.137 に答える