C++ unmanaged

WHAT IS THE FRIEND?

느억맘 2021. 11. 25. 14:16

doSomething 에서 각각의 a, b 객체의 멤버 변수에 접근을 시도하려고 하는데 에러뜬다.

 

왜? 클래스 내부에서 private 로 선언되어있기 때문.

 

해결방법 :

 

각각의 클래스에 doSomething의 이름에 friend를 붙인 놈을 넣는다.

(의미 : void 함수 doSomething(A& a, B& b) => 이놈은 나의 친구다)

 

코드 실행순서

 

  1. => doSomething(a, b) 실행
  2. -> a.m_value 찾아가기
  3. -> a.m_value가 있는 class A로 들어가기
  4. -> 원칙상 private 로 선언되있는 m_value에 접근할수 없지만 doSomething이 친구라고 선언해놓음.(그니까 친구니까 특별하게 접근 허용을 해주는거임)
  5. -> ㅇㅋ 하고, friend void doSomething(A& a, B& b) 를 선언하려고 하는데 처음보는 놈이있음.
  6. -> A&a 는 자기자신이니 알지만, B& b 가 먼지 모름. 
  7. -> 이를 해결하기 위해선 class B 를 class A 위에 선언하던가(근데 이렇게 해봤자 똑같은일 또발생)
  8. 클래스 전방선언이라고 말그대로 class A 위에 class B; 요렇게 "나있음" 이라는 표식을 해줘야함.

19줄에 class B 전방선언 추가

그럼 이제 에러안뜬다.

 

 

friend 는 함수 뿐만 아니라 클래스에도 사용가능하다.

 

class B 안에 있는 doSomething 을 실행해볼 거다.

잘 실행하다가 a.m_value 를 찾으러 class A로 갔더니만 m_value 가 private 로 선언되어있어서 사용할 수가 없단다.

class B 입장에서는 class A에게 니 친구라고 증명할 필요가있다.

 

class A 는 class B 가 친구임을 확인하고는 자기의 변수를 가져가는것을 허락한다.

 

여기서 드는 의문점 :

 

그냥 class B 안에 있는 doSomething 을 쓰려고 굳이 class A 전체와 친구를 먹어야할 필요가 있나?

 

=> 이럴땐 doSomething하고만 친구를 먹으면되는데, 친구먹기위한 과정이 좀 복잡하다.

 

 

먼저, 함수 부분이 있는 class B 를 맨 위로 뺀다. class A 전방선언도 해주고

doSomething의 구현부분이 class B 안에있으면 a.m_value 를 못찾으므로(왜인지는 나도 잘 모른다)

아예 밖으로 구현부분을 빼놓는다. (이러면 찾음)

 

하여튼간에 클래스 내부의 함수랑 친구먹고싶다면 이런 복잡한 절차가 필요하다...

 

순서 :

  1. class B 입장에서는 class A 의 존재 유무만 파악되면 되니 class A는 전방선언을 하였으므로 해결
  2. class A 입장에서는 당연히 doSomething의 존재를 아니 패스
  3. doSomething 에서의 A 역시 위에 다 까발려졌으므로 존재한다는것을 아니 오류없고
  4. 실행

b.doSomething(a) => class B 로가 doSomething(A& a) 실행 , A가 뭔데? 위에전방선언으로 알려줌

=> B::doSomething으로 가서 => class a 로가서 변수 내놓으라고함 => 친구증명 변수받아옴

=> 무사히 코드 실행완료

 

위의 코드에서 한가지라도 순서가 틀리면 오류를 뿜뿜 뿜어주시니 조심해야한다. (나같으면 안쓸래)

'C++ unmanaged' 카테고리의 다른 글

연산자 오버로딩의 3가지 형태  (0) 2021.11.25
헷갈리기쉬운 reference, const !!!!!!!!!!!  (0) 2021.11.25