【VC++】operatorキーワードで演算子をオーバーロードする
<機能>
(1)社員ID(int)、社員名(CString)、通勤費支給(BOOL)を持つクラスを定義
(2)クラスのメンバ変数を operator= でコピーできるようにする
オブジェクトA = オブジェクトB でメンバ変数をコピー
(3)クラスインスタンスを動的配列(std::vector)に operator+ で追加する
(4)追加と同時にソート処理を実施する
オブジェクトA + オブジェクトB でオブジェクトAの動的配列にオブジェクトBを追加
オブジェクトAの動的配列を社員IDの昇順でソート(std::sort)
<実行イメージ>
"出力"ウィンドウに結果を表示します
※表示されていない場合は[表示]メニュー→[出力]
<動作検証&開発環境>
Visual Studio Community 2017
<使い方>
1.プロジェクトの種類でWindowsデスクトップウィザードを選択
2.アプリケーションの種類で「コンソールアプリケーション」を選択
3.共通ヘッダの「MFC」にチェック
4.クラスを追加
クラス名:CShainClass
ファイル名:ShainClass.h
(ShainClass.cppは本サンプルでは使用しません)
5.ソースを追加
ShainClass.h
#pragma once
#include <vector>
#include <algorithm> //sort
#include <vector>
#include <algorithm> //sort
//社員クラス(CShainClass)
class CShainClass
{
private:
int iShainID; //社員ID
CString strName; //社員氏名
BOOL bAllowance; //通勤手当支給対象
class CShainClass
{
private:
int iShainID; //社員ID
CString strName; //社員氏名
BOOL bAllowance; //通勤手当支給対象
//全社員情報を格納するvector配列
std::vector<CShainClass> vShainClass;
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;
}
};
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() {};
//コンストラクタ(初期化)
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(); }
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;
}
//詳細は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());
}
};
//社員情報を追加(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 "Project1.h"
#include "ShainClass.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
#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;
{
if (!AfxWinInit(hModule, nullptr, ::GetCommandLine(), 0))
{
//省略~~
}
else
{
CString csmsg,cstmp;
//operator= のテスト ここから ///////////////////////
CShainClass tmp1, tmp2;
//tmp2に値をセット
tmp2.SetShainData(99,L"OperatorTest Ichiro",false);
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= のテスト ここまで ///////////////////////
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;
//要素を定義して全社員クラスに追加する
//追加と同時にソートされる
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
{
//省略~~
}
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;
}
}
よろしければポチッと押してください