• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    미해결

[10:30]class 정의 순서에 따른 에러

22.09.04 02:44 작성 조회수 351

0

두 코드를 실행시켜 봤는데 class 정의 순서에 따라 friend키워드에 의한 에러 유무가 달라졌습니다.

#include <iostream>

using namespace std;

class A;

class B {

private:

int _val = 2;

friend void print(A& a, B& b);

public:

void print(A& a);

};

void print(A& a, B& b) {

cout << a._val << " " << b._val << endl;

}

class A {

private:

int _val = 0;

friend void print(A& a, B&b);

friend void B::print(A& a);

};

void B::print(A& a) {

cout << a._val << endl;

}

int main() {

A a;

B b;

print(a,b);

return 0;

}

class B의 정의가 class A의 정의보다 위에 있는 이 코드는 에러가 나지 않았고요,

#include <iostream>

using namespace std;

class B;

class A {

private:

int _val = 0;

friend void print(A& a, B&b);

friend void B::print(A& a);

};

class B {

private:

int _val = 2;

friend void print(A& a, B& b);

public:

void print(A& a);

};

void print(A& a, B& b) {

cout << a._val << " " << b._val << endl;

}

void B::print(A& a) {

cout << a._val << endl;

}

int main() {

A a;

B b;

print(a,b);

return 0;

}

class A의 정의가 class B의 정의보다 위에 있는 이 코드는 A::_val이 접근 불가하다는 에러가 났습니다.

에러의 이유를 생각해 봤는데, friend키워드는 1번만 유효한 건가요? friend void B::print(A& a) 이후 처음으로 만나는 B::print 함수에 대해서만 friend처리를 해 준다는 인상을 받았습니다.

답변 1

답변을 작성해보세요.

0

강민철님의 프로필

강민철

2022.09.04

음.. 위 코드도 아래와 같이 에러가 나는데 확인바랍니다.

test.cc:16:12: error: member access into incomplete type 'A'
  cout << a._val << " " << b._val << endl;
           ^