생성자 외부 정의

BS_Lee·2024년 5월 6일
0

C++

목록 보기
10/15

외부 생성자란?

  • 클래스 내부에서 정의하는 것이 아닌, 클래스 외부에서 생성하는 생성자를 의미한다.
  • C++상 코드를 순차적으로 읽기 때문에, 추후에 생성자를 지정해야 될 경우 사용한다.
#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의 생성자를 재정의한 것이다.

profile
설명이 가능할 때까지 공부하기.

0개의 댓글