Cでは構造体同士を比較演算子'=='や'!='で比較することはできません。
C++ではoperatorを使うことで構造体同士を演算子で比較することができます。
サンプルコード・・・コマンドで与えられた名前とIDが従業員と一致するか判定し、新人かどうか比較する
まずはCで書いたコード。
SampleC.c
#include <stdio.h>
#include <string.h>
typedef struct guy_st
{
const char* name;
const char* id;
}GUY_ST;
static GUY_ST Set_struct(const char* name, const char* id)
{
GUY_ST Guy;
Guy.name = name;
Guy.id = id;
return Guy;
}
static int Guy_equal(GUY_ST employee, GUY_ST newguy)
{
return (!strcmp(employee.name, newguy.name) &&
!strcmp(employee.id, newguy.id));
}
int main(int argc, char *argv[])
{
GUY_ST employee = Set_struct("JohnSmith", "A0001");
GUY_ST newGuy = Set_struct(argv[1], argv[2]);
if (Guy_equal(employee, newGuy))
{
printf("You are not new.\n");
}
else
{
printf("Welcome new guy.\n");
}
return 0;
}
次はC++で書いたコード。
SampleC++.cpp
#include <iostream>
#include <string>
using namespace std;
struct Guy_St
{
std::string name;
std::string id;
Guy_St(std::string name, std::string id)
:name(name),
id(id)
{
}
bool operator==(const Guy_St& rhs) const
{
return (name == rhs.name &&
id == rhs.id);
}
};
int main(int argc, char *argv[])
{
Guy_St employee("JohnSmith", "A0001");
Guy_St newGuy(argv[1], argv[2]);
if (employee == newGuy)
{
std::cout << "You are not new." << "\n";
}
else
{
std::cout << "Welcome new guy." << "\n";
}
return 0;
}
構造体の中に構造体メンバの初期化処理と比較処理があることと、
比較演算子でif文を作ることができていることでリーダブル性が向上しました。
出力結果
$ gcc SampleC.c
$ ./a.out JohnSmith A0001
You are not new.
$ ./a.out JohnSmith A0002
Welcome new guy.
$ g++ -std=c++11 SampleC++.cpp
$ ./a.out JohnSmith A0001
You are not new.
$ ./a.out JohnSmith A0002
Welcome new guy.