• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    미해결

마지막 friend member 함수에 대해 질문합니다.

20.12.19 16:10 작성 조회수 188

1

마지막 friend에 대한 질문입니다. 

class B 안에 void doSomething(A &a)가 있고 

그 다음 class A 에 friend void B::doSomething(A &a)가 있어서 이것을 따로 떼어낸 

void B::doSomething(A &a)가 작동되는 것은 이해 하였습니다.

그래서 응용해 보았는데요.  위에 있던 class B와 아래에 있던 class A의 순서를 위의 class A, 아래의 class B로 바꾸고, 전방선언 되어있던 class A를 class B로 바꾸었는데도 잘 안됩니다. 

class A와 class B의 순서를 바꾸었을 때는 어떻게 하면 그 전과 같이 결과를 낼 수 있을까요?

답변 4

·

답변을 작성해보세요.

2

안소님의 프로필

안소

2020.12.29

네 맞습니다!

B에서 A 클래스 전체를 friend 로 삼으려는거면 전방선언 class A; 정도만 해줘도 무방하겠지만

B에서 만약 A의 특정 멤버 함수만을 friend 로 삼으려는거면 반드시 A의 그 멤버 함수 정의 부분이 B 보다 순서가 앞서야겠습니다.

그래야 B 클래스에서 A 에 그런 멤버함수가 있다는 것을 알 수 있고 이거를 friend로 삼겠다는거구나 하고 알 수 있어서요

2

안소님의 프로필

안소

2020.12.19

질문자님께서 말씀하신 것처럼 강의에 나온 코드에서 1. A클래스와 B클래스의 순서를 바꿨고 2. B 클래스를 전방선언 해보았습니다. 질문자님 말씀처럼 friend로 지정해주었음에도 불구하고 A의 m_value 멤버 변수에 접근할 수가 없는 문제가 생기네요 ㅠ ㅜ

오류 메세지를 확인해보면 클래스 A 의 친구 선언인 friend void B::doSomething(A & a); 가 있는 줄인 14번째 줄에서 정의 되지 않은 형식 B 를 사용했다고 알려주고 있습니다. 이 오류가 난 이유는, A가 B의 doSomething 멤버 함수를 친구로서 선언하겠다고 시점에서의 B 클래스의 모습은 class B; 👈 이게 다였기 때문입니다.즉,  A가 B의 doSomething 멤버 함수를 친구로서 선언하겠다고 시점에는 전방 선언을 통해 B라는 클래스가 있다는 것을 알고 있기는 하지만 B 클래스에  doSomething 멤버 함수가 있는지는 모르기 때문입니다. 저 시점에서 A가 알고 있는 B의 모습은 class B; 이게 다이기 때문이죠. 당시 A의 입장에선, B에겐 아직 아무런 멤버 함수도 없는걸로 알고 있는데 B의 멤버 함수를 친구로 선언했다고 알려줬으니 B의 doSomething 함수가 제대로 친구로 등록되지 못했기 때문에 B의 doSomething 에서 A의 private 멤버인 m_value에 접근할 수가 없었던 것입니다.

클래스 A에게 FunctionOfA(B &b) 라는 멤버함수가 있다고 가정해보면 Class B; 로 먼저 전방선언 해주면 단순히 해결 되죠. 이러한 경우엔 그저 B 라는 타입이 존재한다는 것만 A가 알면 됐었기 때문에 class B; 로도 충분했었던 것입니다. 질문자이 접하신 문제에선 A가 B의 doSomething 멤버 함수를 친구로 선언하려면 B에게 doSomething 이라는 멤버 함수가 있다는 것도 당시 시점에서 반드시 알고 있어야 합니다. 따라서 A 클래스에서 B의 멤버함수인 doSomething(A & a) 함수를 친구 등록 하려는 경우에는 강의처럼 반드시 B클래스가 A클래스보다 순서가 앞서야겠습니다. A 클래스가 B 클래스에게 doSomething(A & a) 라는 함수가 있다는 것을 알아야 하기 때문입니다.

이렇게 A의 멤버 함수가 doSomething(B & b); B타입의 매개변수를 가진 함수며 B클래스에서 이를 친구로 등록하고자 한다고 예를 들어보면, 질문자님께서 말씀하신 강의에 나온 코드에서 1️⃣ A클래스와 B클래스의 순서를 바꿨고 2️⃣ B 클래스를 전방선언 한 경우에 문제가 없는 것을 화긴할 수 있습니다. A 클래스에선 전방 선언을 통해 B라는 타입이 존재한 다는 것을 알 수 있었으니 매개 변수가 B 타입이여도 문제가 없고,  A 클래스의 doSomething 멤버 함수가 정의가 B 클래스보다 앞섰으므로 B 클래스에서 이를 친구로 선언할 시점엔 A 클래스에서 doSomething 멤버 함수가 있다는 것을 알기 때문에 문제 없네요!

0

홍길동님의 프로필

홍길동

2020.12.29

joy님의 보충설명이 강의의 이해를 보다 100%에 가깝게 만들어주는 것 같습니다.

이 답변을 보면서 문득 든 의문점인데, 그렇다면 논리상 멤버 함수의 정의를 가진 클래스가 friend를 할 클래스보다 우선순위가 되어야 한다는 말씀이신가요?

(코딩 순서상)

class A;
{
    멤버 함수의 정의를 가지고 있음!
};

class B;
{
    A를 friend할 클래스
};

이 두 클래스의 순서가 바뀌면 오류 발생!?

0

ceaser3484님의 프로필

ceaser3484

질문자

2020.12.23

그러면 forward declation은 그냥 이런 클래스가 있다는 공지하는 키워드군요.. 

설명 감사합니다.