개발자 '쑥말고인절미'

[C++] 헤더파일 import 하지않고 포인터 사용해서 클래스 간 메소드 참조하기 본문

STUDY/C++ & MFC

[C++] 헤더파일 import 하지않고 포인터 사용해서 클래스 간 메소드 참조하기

쑥말고인절미 2024. 8. 7. 23:54

클래스 전방 선언

  • 전방 선언을 사용하면 헤더 파일에서 클래스의 이름만 알려주고, 실제 클래스 정의는 해당 클래스가 필요한 구현 파일에서 포함하도록 할 수 있다.

전방 선언 사용 방법

  1. 클래스 전방 선언 (Forward Declaration)
    • 헤더 파일에서 다른 클래스에 대한 포인터나 참조를 사용하려면 해당 클래스의 전방 선언을 사용할 수 있다. 전방 선언은 클래스의 정의가 아닌 클래스의 이름만 알려준다.
  2. 구현 파일에서 클래스 정의 포함
    • 실제 클래스 정의가 필요한 구현 파일에서 헤더 파일을 포함한다.
//--------------------------- A.h(헤더)

#ifndef A_H
#define A_H

class A {
public:
    void setValue(int val);
    int getValue() const;

private:
    int value;
};

#endif // A_H

//--------------------------- A.cpp(구현파일)
#include "A.h"

void A::setValue(int val) {
    value = val;
}

int A::getValue() const {
    return value;
}

//--------------------------- B.h(헤더)
#ifndef B_H
#define B_H

class A;  // 클래스 A의 전방 선언

class B {
public:
    void sendValueToA(A* a, int val);  // A 클래스의 포인터 사용
};

#endif // B_H


//--------------------------- B.cpp(구현파일)
#include "B.h"
#include "A.h"  // 클래스 A의 정의 포함

void B::sendValueToA(A* a, int val) {
    if (a != nullptr) {
        a->setValue(val);
    }
}

//--------------------------- Main.cpp(메인 함수)
#include <iostream>
#include "A.h"
#include "B.h"

int main() {
    A a;
    B b;

    b.sendValueToA(&a, 10);
    std::cout << "Value of a: " << a.getValue() << std::endl;  // 출력: 10

    return 0;
}

설명

  1. 클래스 전방 선언
    • B.h 파일에서는 class A; 를 통해 클래스 A의 전방 선언을 한다.
    • 이는 B 클래스에서 A 클래스의 포인터나 참조를 사용할 수 있게 한다.
  2. 헤더 파일 포함
    • B.cpp 파일에서는 A.h 를 포함하여 A 클래스의 전체 정의를 사용할 수 있도록 한다.
    • 이는 sendValueToA() 메서드에서 A 클래스의 멤버 함수인 setValue() 를 호출하기 위해 필요하다.
  3. 포인터 사용
    • B 클래스sendValueToA() 메서드A 클래스의 포인터를 매개변수로 받아서 값을 설정한다.
    • 포인터를 사용함으로써 B.h 파일에서 A.h 를 포함하지 않고도 A 클래스를 참조할 수 있다.

결론

  • 헤더 파일을 포함하지 않고 포인터를 사용하여 클래스를 참조하는 방법은 전방 선언을 통해 가능하다.
  • 전방 선언을 사용하면 클래스의 정의가 필요 없는 헤더 파일에서 다른 클래스의 이름만 알려주고, 실제로 클래스의 정의가 필요한 구현 파일에서 해당 헤더 파일을 포함하면 된다.
  • 이를 통해 클래스 간의 의존성을 줄이고, 컴파일 시간을 단축할 수 있다.