클래스 전방 선언
- 전방 선언을 사용하면 헤더 파일에서 클래스의 이름만 알려주고, 실제 클래스 정의는 해당 클래스가 필요한 구현 파일에서 포함하도록 할 수 있다.
전방 선언 사용 방법
- 클래스 전방 선언 (Forward Declaration)
- 헤더 파일에서 다른 클래스에 대한 포인터나 참조를 사용하려면 해당 클래스의 전방 선언을 사용할 수 있다. 전방 선언은 클래스의 정의가 아닌 클래스의 이름만 알려준다.
- 구현 파일에서 클래스 정의 포함
- 실제 클래스 정의가 필요한 구현 파일에서 헤더 파일을 포함한다.
//--------------------------- 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;
}
설명
- 클래스 전방 선언
- B.h 파일에서는 class A; 를 통해 클래스 A의 전방 선언을 한다.
- 이는 B 클래스에서 A 클래스의 포인터나 참조를 사용할 수 있게 한다.
- 헤더 파일 포함
- B.cpp 파일에서는 A.h 를 포함하여 A 클래스의 전체 정의를 사용할 수 있도록 한다.
- 이는 sendValueToA() 메서드에서 A 클래스의 멤버 함수인 setValue() 를 호출하기 위해 필요하다.
- 포인터 사용
- B 클래스의 sendValueToA() 메서드는 A 클래스의 포인터를 매개변수로 받아서 값을 설정한다.
- 포인터를 사용함으로써 B.h 파일에서 A.h 를 포함하지 않고도 A 클래스를 참조할 수 있다.
결론
- 헤더 파일을 포함하지 않고 포인터를 사용하여 클래스를 참조하는 방법은 전방 선언을 통해 가능하다.
- 전방 선언을 사용하면 클래스의 정의가 필요 없는 헤더 파일에서 다른 클래스의 이름만 알려주고, 실제로 클래스의 정의가 필요한 구현 파일에서 해당 헤더 파일을 포함하면 된다.
- 이를 통해 클래스 간의 의존성을 줄이고, 컴파일 시간을 단축할 수 있다.