전방선언 (forward Declartion)

프로그램 규모가 커지다보면 파일간의 의존도가 높아져서 컴파일시간이 늘어난다.

  1. ‘#include’ 의존성을 최소화에 목적

조건

  • 포인터 및 참조 형태로 이름만 참조가 가능하다.
1
2
3
4
5
6
7
8
9
10
class A;  // 전방선언

class B
{
public:
// 포인터 형태 이름 참조
B(const A* AInstance);
// 참조 형태 이름 참조
B(const A& AInstance);
};
  • 매개변수, 리턴타입을 위한 이름만 참조한다.
1
2
3
4
5
6
7
8
class A;

class B
{
public:
void SetA(A a);
A GetA() const;
};

전방선언을 할경우, 컴파일러에게 심볼 테이블에 추가하고, 그 클래스의 정의를 제공해주겠다고 약속한다.

cpp 파일에는 헤더 include가 들어간다. (클래스 정의)

Type Slice

부모, 자식 클래스의 오브젝트를 대입시킬때, 자식클래스의 객체를 부모의 객체로 대입시킬때 일부 정보가 사라지는 문제. (Upcast)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Human
{
public:
string name;
};

class Student : public Human
{
public:
int stNum;
};

Human H("A");
Student S("B", 1000);

H = S; // 가능
S = H; // 에러

seon님의 슬라이스 문제

H 객체에는 stNum에 대응되는 값이 없기 때문에, 날라가게된다.

반대로 한다면?

1
pS = (Student *)&H;

seon님의 슬라이스 문제

참고한 곳의 저자가 부모의 포인터는 자식을 가르킬수 있다는 점을 기억해야된다고 함.

참고 사이트

타입슬라이스 : Soen.kr 혼자 연구하는 C/C++