【VC++】operatorキーワードで演算子をオーバーロードする

0

    <機能>

    (1)社員ID(int)、社員名(CString)、通勤費支給(BOOL)を持つクラスを定義

    (2)クラスのメンバ変数を operator= でコピーできるようにする

     オブジェクトA = オブジェクトB でメンバ変数をコピー

    (3)クラスインスタンスを動的配列(std::vector)に operator+ で追加する

    (4)追加と同時にソート処理を実施する

     オブジェクトA + オブジェクトB でオブジェクトAの動的配列にオブジェクトBを追加

     オブジェクトAの動的配列を社員IDの昇順でソート(std::sort)

     

    <実行イメージ>

    "出力"ウィンドウに結果を表示します

    ※表示されていない場合は[表示]メニュー→[出力]

    VC,MFC,VisualStudio,operator,sort,演算子のオーバーロード,
     

    <動作検証&開発環境>

    Visual Studio Community 2017

     

    <使い方>

    1.プロジェクトの種類でWindowsデスクトップウィザードを選択

    2.アプリケーションの種類で「コンソールアプリケーション」を選択

    3.共通ヘッダの「MFC」にチェック

    VC,MFC,VisualStudio,operator,sort,演算子のオーバーロード,
     

    4.クラスを追加

     クラス名:CShainClass

     ファイル名:ShainClass.h

     (ShainClass.cppは本サンプルでは使用しません)

    5.ソースを追加

     

    ShainClass.h

    #pragma once
    #include <vector>
    #include <algorithm> //sort
    //社員クラス(CShainClass)
    class CShainClass
    {
    private:
        int iShainID;           //社員ID
        CString strName;    //社員氏名
        BOOL bAllowance;   //通勤手当支給対象
        //全社員情報を格納するvector配列
        std::vector<CShainClass> vShainClass;
        //社員情報を社員IDが小さい順でソートする
        struct sort_shainNo : std::binary_function<CShainClass&, CShainClass&, bool>
        {
            bool operator()(CShainClass &a, CShainClass &b)
            {
                if (a.iShainID < b.iShainID) return true;
                return false;
            }
        };
    public:
        //コンストラクタ(初期化)
        CShainClass() :iShainID(0), strName(""), bAllowance(FALSE) {};
        //デストラクタ
        ~CShainClass() {};
        //set/get
        void SetShainData(int a, CString b, bool c) {
            iShainID = a;
            strName = b;
            bAllowance = c;
        }
        int GetID() { return iShainID; }
        CString GetName() { return strName; }
        bool GetAllowance() { return bAllowance; }
        auto GetBegin() { return vShainClass.begin();}
        auto GetEnd() { return vShainClass.end(); }
        //=演算子をオーバーロード(メンバ変数をコピーする)
        //詳細はDeveloperNetwork参照

        void operator = (CShainClass& shain)
        {
            iShainID = shain.iShainID;
            strName = shain.strName;
            bAllowance = shain.bAllowance;
        }
        //+演算子をオーバーロード(メンバ変数をコピー&ソートする)
        //社員情報を追加(push_back)

        void operator + (CShainClass& shain)
        {
            vShainClass.push_back(shain);
            std::sort(vShainClass.begin(), vShainClass.end(), sort_shainNo());
        }
    };

     

    Main(Project1.cpp)
    #include "stdafx.h"
    #include "Project1.h"
    #include "ShainClass.h"
    #ifdef _DEBUG
    #define new DEBUG_NEW
    #endif

    // 唯一のアプリケーション オブジェクトです。
    CWinApp theApp;
    using namespace std;
    int main()
    {
        //省略~~
        if (hModule != nullptr)
        {
            if (!AfxWinInit(hModule, nullptr, ::GetCommandLine(), 0))
            {
                //省略~~
            }
            else
            {
                CString csmsg,cstmp;
               
                //operator= のテスト ここから ///////////////////////
                CShainClass tmp1, tmp2;
                //tmp2に値をセット
                tmp2.SetShainData(99,L"OperatorTest Ichiro",false);
                //tmp1に値にtmp2をコピー
                tmp1 = tmp2;
                //operator= の結果を確認
                cstmp.Format(L"tmp1.iShainID=%d tmp1.strName=%s tmp1.bAllowance=%d¥r¥n¥r¥n",
                                        tmp1.GetID(), tmp1.GetName(), tmp1.GetAllowance());
                csmsg = L"¥r¥n□operator= のテスト¥r¥n" + cstmp;
                //operator= のテスト ここまで ///////////////////////
               
                CShainClass allShain, tmpShain;
                //要素を定義して全社員クラスに追加する
                //追加と同時にソートされる

                tmpShain.SetShainData(71, L"山田太郎", false);
                allShain + tmpShain;
                tmpShain.SetShainData(167, L"鈴木花子", true);
                allShain + tmpShain;
                tmpShain.SetShainData(108, L"佐々木小次郎", true);
                allShain + tmpShain;
                tmpShain.SetShainData(9, L"青木幸子", true);
                allShain + tmpShain;
                //全社員クラスの値を確認(追加&ソート)
                csmsg += L"□全社員クラスの値を確認(operator+ で追加とソート)¥r¥n";
                for (auto itr = allShain.GetBegin(); itr != allShain.GetEnd(); ++itr)
                {
                    CString cwk = itr->GetName();
                    for (int i = cwk.GetLength()*sizeof(TCHAR); i <= 20; i++)
                    {
                        cwk += L" ";
                    }
                   
                    cstmp.Format(L"社員ID[%03d]  社員氏名[%-s]  通勤費支給[%d]¥r¥n",
                                            itr->GetID(),cwk,itr->GetAllowance());
                    csmsg += cstmp;
                }
                TRACE(csmsg);
            }
        }
        else
        {
            //省略~~
        }
        return nRetCode;
    }
     
    よろしければポチッと押してください


    selected entries

    categories

    calendar

    S M T W T F S
         12
    3456789
    10111213141516
    17181920212223
    24252627282930
    31      
    << March 2024 >>

    profile

    others

    archives