티스토리 뷰

#include <iostream>

using namespace std;

class A
{
	private:
	int m_value = 1;
	
	friend void doSomething(A& a);
};

void doSomething(A& a)
{
	cout << a.m_value << endl;
}

int main()
{
	A a;
	doSomething(a);

	return 0;
}

// 1

 

private이지만 friend이기때문에 접근 가능하다.

 

방법 1.

#include <iostream>

using namespace std;

class B; // forward declaration

class A
{
	private:
	int m_value = 1;
	
	friend void doSomething(A& a, B& b);
};

class B
{
	private:
	int m_value = 2;
	
	friend void doSomething(A& a, B& b);
};

void doSomething(A& a, B& b)
{
	cout << a.m_value << " " << b.m_value << endl;
}

int main()
{
	A a;
	B b;
	doSomething(a, b);

	return 0;
}

// 1 2

 

방법 2.

#include <iostream>

using namespace std;

class B; // forward declaration

class A
{
	private:
	int m_value = 1;
	
	friend class B;
};

class B
{
	private:
	int m_value = 2;
	
	public:
	void doSomething(A& a)
	{
		cout << a.m_value << endl;
	}
};

int main()
{
	A a;
	B b;
	b.doSomething(a);

	return 0;
}

// 1

 

#특정함수만을 friend시키는 방법.

class A
{
	private:
	int m_value = 1;
	
	friend void B::doSomething(A& a);
};

 

첫번째 문제, B안에 doSomething이 있다는걸 A가 알 방법이 없다.

 

해결방안.

#include <iostream>

using namespace std;

class A; // forward declaration

class B
{
	private:
	int m_value = 2;
	
	public:
	void doSomething(A& a);
};

class A
{
	private:
	int m_value = 1;
	
	friend void B::doSomething(A& a);
};

void B::doSomething(A& a)
{
	cout << a.m_value << endl;
}

int main()
{
	A a;
	B b;
	b.doSomething(a);

	return 0;
}

'언어 > C++' 카테고리의 다른 글

8.14 클래스 안에 포함된 자료형 nested types  (0) 2020.04.24
8.13 익명 객체  (0) 2020.04.24
8.11 정적 멤버 함수  (0) 2020.04.24
8.10 정적 멤버 변수  (0) 2020.04.23
8.9 클래스와 const  (0) 2020.04.23
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함