먼저
A.H 의 내용입니다.
#ifndef _H_
#define _H_
#include <iostream>
using namespace std;
class Linked
{
private:
int data;
Linked* next;
public:
Linked(int dat){data = dat;} //인라인 정의.
Linked(){this->next = NULL;}
void Insert(Linked* Data);
};
Linked Head;
#endif
------------------------------------------------------------------------------------
B.cpp 의 내용입니다.
#include "Linked.h"
void Linked::Insert(Linked* Data)
{
//
Linked* tmpdata = new Linked;
.................
}
------------------------------------------------------------------------------------------
C.cpp 의 내용입니다.
#include "Linked.h"
int main()
{
Linked A;
return 0;
}
============================================================================================
이걸 컴파일 하면 링크에러가 납니다.
에러가 나는 이유가 무엇일까요?
C.cpp 에서 #include "Linked.h" 문장을 지우면 제대로 됩니다.
해결 방법을 찾는게 아니고...
이게 왜 에러가 나는걸까요?
분명 해더파일엔 #ifndef ~#endif 으로 중복 선언 방지를 했는데도요...
할지라도요. 변수 선언은 c/c++ 소스상에서 합니다. 그리고 헤더에서는 그 변수의 참조를 선언하는 방식으로 코딩
해야 합니다. 즉, a.h라고 말한 Linked.h 헤더 안에서 "Linked Head;"라고 하는 부분이 두번 참조 되기 때문에
링크 에러가 난 듯 싶습니다. 이 부분은 "extern Linked Head;"로 바꾸고 "Linked Head"는 b.cpp 안에 넣어야
제대로 된 코드라고 생각됩니다. 즉, 클래스 선언은 c++ 소스 안에서 하고 다른 곳 에서는 헤더를 통한 참조가 이루어
져야 한다고 봅니다. 물론 클래스가 동적으로 생성이 되지 않는 다는 것은 조금 이상하긴 하지만요.