전방 선언(forward declarations) 과 정의(definitions)
실제로 식별자를 정의하기 전에 식별자의 존재를 컴파일러에게 미리 알리는 것이다
함수의 경우 전방선언을 하려면 함수 원형으로 사용해야 한다
전방선언을 할 경우 클래스의 존재만 인지시키는 것이기 때문에 포인터로밖에 선언하지 못한다
전방 선언을 사용하는 이유?
- 참조하려는 헤더파일에 변경이 생겨도 헤더파일의 재컴파일이 이루어지지 않기 때문에 효율성과 속도가 증진된다!
- 역참조가 되는 구조를 막기도 한다
코드
Closet.h 에 아래와 같이 선언되어있다고 보자.
class Button;
class Jumper {
Button *pB;
};
전방 선언을 사용하지 않는다면 Closet.cpp는 이렇게 사용해야한다.
#include "Closet.h"
class Jumper {
Button *pB;
};
하지만 전방선언을 쓴다면 요렇게 쓸수 있지롱
#include "Closet.h"
void Jumper::createButton() {
this.pB = new Button;
}
또다른 예를 들자면..
아래 코드의 동작결과는 1+2=3이 아니다!
void main()
{
std::cout<< " 1+2 = :" <<add(1,2)<<std::endl;
}
int add(int x, int y)
{
return x+y;
}
컴파일 에러가 난다...
멍청이 컴파일러는 소스코드를 순서대로 읽기때문에, add함수가 무엇을 뜻하는지 알 수 없다.
이럴때에는 main문 앞에 전방선언으로 한줄만 추가해주면된다.
int add(int x, int y);
void main()
{ ... }
int add(int x , int y)
{ ... }
또는 매개변수의 이름을 지정하지 않고 int add(int,int)꼴로도 선언할 수 있는데
보는사람이 이해하기 힘드니까 그냥 동일하게 쓰는게 좋다 이말씀~
'Programming > C++' 카테고리의 다른 글
[cpp][c++11] noexcept 키워드 (0) | 2022.12.16 |
---|---|
[cpp][c++ 17] std::string_view (0) | 2022.12.07 |
[cpp][effective_c++_19] 클래스 설계는 타입 설계와 똑같이 (0) | 2022.12.01 |
[cpp][effective_c++_18] 인터페이스 설계는 쓰기엔 쉽게, 엉터리로 쓰기엔 어렵게 (0) | 2022.11.23 |
[Cpp] Lambda 표현식에 대하여 알아보자 (1) | 2022.09.08 |