728x90
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
class Cents
{
private:
int m_cents;
public:
Cents(int cents = 0) { m_cents = cents; }
int getCents() const { return m_cents; }
int& getCents() { return m_cents; }
friend std::ostream& operator << (std::ostream& out, const Cents& cents)
{
out << cents.m_cents;
return out;
}
};
int main()
{
return 0;
}

 

앞전에 쓰던 Cents class를 그대로 가져왔습니다.

 

 

int main()
{
Cents cents1(6);
cout << cents1 << endl;
return 0;
}

요기서 의문이 듭니다 출력을 오버 로딩하였기 때문에 정수로 출력되는데 == ,!= 같은 비교 연산자를 바로 사용할 수 없을까? 

 

int main()
{
Cents cents1(6);
cout << cents1 << endl;
cout << typeid(cents1).name() << endl;
return 0;
}

type을 찍어보면 출력을 오버 로딩했을 뿐 정수형이 아닌 class 형입니다.

비교 연산자를 사용하려고 하면 operator 오버 로딩이 필요합니다.

 

class Cents
{
private:
int m_cents;
public:
Cents(int cents = 0) { m_cents = cents; }
int getCents() const { return m_cents; }
int& getCents() { return m_cents; }
friend bool operator == (const Cents &lhs, const Cents &rhs)
{
return lhs.m_cents == rhs.m_cents;
}
friend std::ostream& operator << (std::ostream& out, const Cents& cents)
{
out << cents.m_cents;
return out;
}
};

 

 

class 안에서 friend를 사용하였고 비교 연산자는 true flase를 return 하기 때문에 bool type으로 지정합니다.

좌변(left hand side)과 우변(right hand side)을 파라미터로 받아 비교하고 return 합니다.

 

int main()
{
Cents cents1(6);
Cents cents2(7);
if (cents1 == cents2)
cout << "Equal" << endl;
else
cout << "Not Equal" << endl;
return 0;
}

 

 

비교 연산자를 이용해 cents를 배열로 만든 뒤 sort함수를 사용해 정렬해보겠습니다.

 

 

#include <iostream>
#include <vector>
#include <algorithm>
int main()
{
vector<Cents> arr(20);
for (unsigned int i = 0; i < 20; ++i)
arr[i].getCents() = i;
random_shuffle(begin(arr), end(arr));
for (const auto& e : arr)
cout << e << " ";
cout << endl;
return 0;
}

20개의 정수를 담을 수 있는 배열을 만든 뒤 반복문으로 0 ~ 19까지 배열에 추가합니다.

random shuffle 함수를 사용해 무작위로 배열을 섞습니다.

 

sort(begin(arr), end(arr));

요기서 sort 함수를 사용하면 에러를 발생시킵니다 sort함수는 class 안의 정수를 읽을 수 없습니다.

 

class Cents
{
private:
int m_cents;
public:
Cents(int cents = 0) { m_cents = cents; }
int getCents() const { return m_cents; }
int& getCents() { return m_cents; }
friend bool operator < (const Cents &c1, const Cents &c2)
{
return c1.m_cents < c2.m_cents;
}
friend std::ostream& operator << (std::ostream& out, const Cents& cents)
{
out << cents.m_cents;
return out;
}
};


sort 함수에 사용할 연산자 오버 로딩을 할 때는 우변이 더 크냐 라는 연산자를 오버 로딩에서 구현해야 합니다.

좌변이 더 크냐 >를 사용 할시 컴파일 에러가 발생합니다.

 

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
class Cents
{
private:
int m_cents;
public:
Cents(int cents = 0) { m_cents = cents; }
int getCents() const { return m_cents; }
int& getCents() { return m_cents; }
Cents operator - () const
{
return Cents(-m_cents);
}
bool operator ! () const
{
return (m_cents == 0) ? true : false;
}
friend bool operator < (const Cents &c1, const Cents &c2)
{
return c1.m_cents < c2.m_cents;
}
friend bool operator == (const Cents &lhs, const Cents &rhs)
{
return lhs.m_cents == rhs.m_cents;
}
friend std::ostream& operator << (std::ostream& out, const Cents& cents)
{
out << cents.m_cents;
return out;
}
};
int main()
{
vector<Cents> arr(20);
for (unsigned int i = 0; i < 20; ++i)
arr[i].getCents() = i;
random_shuffle(begin(arr), end(arr));
for (const auto& e : arr)
cout << e << " ";
cout << endl;
sort(begin(arr), end(arr));
for (const auto& e : arr)
cout << e << " ";
cout << endl;
return 0;
}

 

 

 

728x90