본문 바로가기
개발/C, C++

C++ - friend로 private 멤버 출력하기 (Printing private members using friend)

by 피로물든딸기 2024. 2. 13.
반응형

C, C++ 전체 링크

 

참고

- 연산자 오버로딩을 이용하여 구조체 출력하기

- 스마트 포인터 : unique_ptr

 

아래 코드를 실행하면 컴파일 에러가 발생한다.

#include <iostream>
#include <string>

using namespace std;

class Bread
{
public:
	Bread(string n, int p) : name(n), price(p) {}

	string getName() const { return name; }
	void setName(const string &n) { name = n; }
	int getPrice() const { return price; }
	void setPrice(const int p) { price = p; }

private:
	string name;
	int price;
};

int main(void)
{
	Bread* b1 = new Bread("Pizza", 1000);

	cout << b1->name << endl;
	cout << b1->price << endl;

	return 0;
}

 

private 멤버에 직접 접근하여 값을 읽으려고 했기 때문이다.

 

따라서 제공하는 get 메서드를 이용해 멤버에 접근해야 한다.

int main(void)
{
	Bread* b1 = new Bread("Pizza", 1000);

	cout << b1->getName() << endl;
	cout << b1->getPrice() << endl;

	return 0;
}


friend

 

friend 키워드를 이용하면 privated 멤버 함수에 직접적으로 접근할 수 있다.

연산자 오버로딩을 이용하여 다음과 같이 Bread 클래스멤버 변수에 접근해 보자.

#include <iostream>
#include <string>

using namespace std;

class Bread
{
	friend ostream& operator<<(ostream &os, const Bread &b)
	{
		os << "Name  : " << b.name << endl;
		os << "Price : " << b.price;

		return os;
	}

public:
	Bread(string n, int p) : name(n), price(p) {}

private:
	string name;
	int price;
};

int main(void)
{
	Bread* b1 = new Bread("Pizza", 1000);
	cout << *b1 << endl;

	return 0;
}


unique_ptr 출력하기

 

unique_ptr로 만든 객체는 정상적으로 출력되지 않는다.

	unique_ptr<Bread> b2 = make_unique<Bread>("Muffin", 3000);
	cout << b2.get() << endl;

 

unique_ptrfriend 함수 내에서 액세스를 허용하지 않기 때문에, 해당 객체에 대한 포인터를 받도록 수정해야 한다.

	friend ostream& operator<<(ostream &os, const Bread* b)
	{
		os << "Name  : " << b->name << endl;
		os << "Price : " << b->price << endl;

		return os;
	}

 

전체 코드는 다음과 같다.

#include <iostream>
#include <string>

using namespace std;

class Bread
{
	friend ostream& operator<<(ostream &os, const Bread* b)
	{
		os << "Name  : " << b->name << endl;
		os << "Price : " << b->price << endl;

		return os;
	}

public:
	Bread(string n, int p) : name(n), price(p) {}

private:
	string name;
	int price;
};

int main(void)
{
	unique_ptr<Bread> b2 = make_unique<Bread>("Muffin", 3000);
	cout << b2.get() << endl;

	return 0;
}
반응형

댓글