#include <iostream>
class FriendClass { // 컴파일 오류 발생!!
public:
FriendClass(MyClass& my){
// MyClass에 있는 value 변수에 100을 다시 대입.
my.value = 100;
}
};
class MyClass {
private:
int value;
public:
// 생성자
MyClass(int v) : value(v) {}
// FriendClass를 friend로 지정.
friend class FriendClass;
};
int main() {
MyClass fc(10);
FriendClass fr(fc); // 컴파일 오류 발생!!
return 0;
}
목적
main에서 MyClass를 생성해서 그 결과를 FriendCalss의 생성자에 주입해주려고 함.
문재발생
그러나 왜인지는 모르겠지만 컴파일 도중에 FriendClass::FriendClass(MyClass&)
를 찾을 수 없다고 오류가 뜬다.
아마도 FriendClass를 읽는 도중에 MyClass가 아직 컴파일이 완료가 안되서 오류가 발생하는 것으로 보인다.
해결방법
이 문제를 해결하기 위해서 MyClass가 선언되고나서 FriendClass의 생성자를 재정의해서 사용하면 해결이 된다.
#include <iostream>
class MyClass; // MyClass 선언
class FriendClass {
public:
// 생성자로 MyClass의 private 멤버에 접근하여 값을 변경
FriendClass(MyClass& my); // FriendClass의 생성자 선언
};
class MyClass {
private:
int value;
public:
// 생성자
MyClass(int v) : value(v) {}
// FriendClass를 friend로 지정
friend class FriendClass;
};
// FriendClass의 생성자 정의
FriendClass::FriendClass(MyClass& my) {
my.value = 100;
}
int main() {
MyClass fc(10);
FriendClass fr(fc);
return 0;
}
MyClass의 정의를 알 수 있도록 MyClass를 먼저 선언하고, 그 후에 FriendClass의 생성자를 재정의한 것이다.