반응형
참고
아래 코드를 실행하면 컴파일 에러가 발생한다.
#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_ptr은 friend 함수 내에서 액세스를 허용하지 않기 때문에, 해당 객체에 대한 포인터를 받도록 수정해야 한다.
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;
}
반응형
'개발 > C, C++' 카테고리의 다른 글
C++ - 템플릿으로 클래스 상속하기 (Mixin Inheritance) (0) | 2024.03.06 |
---|---|
C++ - CRTP로 인터페이스 만들기 (Interface with Curiously Recurring Template Pattern) (0) | 2024.03.06 |
C++ - atomic으로 원자적 연산 처리하기 (vs mutex) (0) | 2024.01.26 |
C++ - call_once로 함수를 한 번만 호출하기 (0) | 2024.01.24 |
C++ - 정수를 IP로 변환하기 (IP Converter for IPv4, IPv6, Integer, in_addr, in6_addr) (1) | 2023.11.28 |
댓글