operator (1)

MFC::CStringクラスを用いて、条件連結演算子を定義してみます。
今回作成するのは「式の左側が空文字列の場合、右側を代入」するための演算子を定義します。

ここでは、RubyやPerl等の初期化テクニックで有名な | 演算子を用いることにします。

なお、デフォルトの CString クラスでは、operator << も、operator | も、operator |= も定義されていませんでした。

Windows2000sp4/VC++6sp6/MFC

mystring < CString

    #include <stdafx.h>
    #include <iostream>
    #include <string>
    using namespace std;

    class mystring : public CString
    {
        typedef mystring self;
        typedef CString super;

    public:
        mystring()
        {
        }

        mystring(LPCTSTR lpsz) : super(lpsz)
        {
        }

        virtual ~mystring()
        {
        }

        self& operator |= (const self& other)
        {
            if( this->IsEmpty() ){
                // 暗黙の operator = で処理
                *this = other;

                // 下記の方法でも良いが、自クラスで operator = を明示的に定義した場合を
                // 考えると上記の方法の方がベターだと思われます。
                // super::operator = (other);
            }
            return *this;
        }

        friend const self& operator | (const self& lhs, const self& rhs)
        {
            if( lhs.IsEmpty() ){
                return rhs;
            }else{
                return lhs;
            }
        }

        friend ostream& operator << (ostream& out, const mystring& str)
        {
            return out << static_cast<LPCTSTR>(str);
        }
    };

    int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
    {
        mystring a = _T(""), b = _T("BBB"), c = _T("CCC"), result;

        // operator | のテスト
        result = a | b | c;     // (a | b) | c

        // operator << のテスト
        cout << result << endl; // "BBB"

        // operator |= のテスト
        result  = a;
        result |= c;
        result |= b;
        cout << result << endl; // "CCC"

        return 0;
    }

[HOME]-[RTL]
Copyright© 2005-2006 RAPT.