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