정적 클래스 멤버에서 해석되지 않은 외부 기호
간단히 말해서 :
대부분 정적 공용 멤버로 구성된 클래스가 있으므로 다른 클래스 / 함수에서 호출해야하는 유사한 함수를 함께 그룹화 할 수 있습니다.
어쨌든, 클래스 공용 범위에서 두 개의 정적 부호없는 char 변수를 정의했습니다. 같은 클래스의 생성자에서 이러한 값을 수정하려고 할 때 컴파일 할 때 "해결되지 않은 외부 기호"오류가 발생합니다.
class test
{
public:
static unsigned char X;
static unsigned char Y;
...
test();
};
test::test()
{
X = 1;
Y = 2;
}
저는 C ++을 처음 사용하므로 쉽게 사용할 수 있습니다. 왜 이렇게 할 수 없습니까?
X와 Y의 선언과 일치하도록 정의를 추가하는 것을 잊었습니다
unsigned char test::X;
unsigned char test::Y;
어딘가에. 정적 멤버를 초기화하고 싶을 수도 있습니다.
unsigned char test::X = 4;
그리고 다시, 선언이 아닌 정의 (보통 CXX 파일에서)에서 수행합니다 (종종 .H 파일에 있음)
클래스 선언의 정적 데이터 멤버 선언은 정의가 아닙니다. 그것들을 정의하려면 .CPP
파일에서 중복 기호를 피하기 위해이 작업을 수행해야합니다 .
선언하고 정의 할 수있는 유일한 데이터는 정수 정적 상수입니다. (의 값은 enums
상수 값으로도 사용될 수 있습니다)
코드를 다음과 같이 다시 작성할 수 있습니다.
class test {
public:
const static unsigned char X = 1;
const static unsigned char Y = 2;
...
test();
};
test::test() {
}
당신은 당신이 정적 변수를 수정할 수있는 능력을 가지고 싶다면 당신이 사이에 당신에게 코드를 분리 할 수 있습니다 (즉 CONST로 선언하는 것은 적절 인 경우) .H
및 .CPP
다음과 같은 방법으로 :
.H :
class test {
public:
static unsigned char X;
static unsigned char Y;
...
test();
};
.CPP :
unsigned char test::X = 1;
unsigned char test::Y = 2;
test::test()
{
// constructor is empty.
// We don't initialize static data member here,
// because static data initialization will happen on every constructor call.
}
이것은 일반적으로 "정적 const 멤버를 가진 해결되지 않은 외부 요소"를 검색 할 때 나에게 보이는 첫 번째 SO 스레드이므로, 해결되지 않은 외부 장치의 한 가지 문제를 해결하기위한 또 다른 힌트를 남길 것입니다.
For me, the thing that I forgot was to mark my class definition __declspec(dllexport)
, and when called from another class (outside that class's dll's boundaries), I of course got the my unresolved external error.
Still, easy to forget when you're changing an internal helper class to a one accessible from elsewhere, so if you're working in a dynamically linked project, you might as well check that, too.
in my case, I declared one static variable in .h file, like
//myClass.h
class myClass
{
static int m_nMyVar;
static void myFunc();
}
and in myClass.cpp, I tried to use this m_nMyVar. It got LINK error like:
error LNK2001: unresolved external symbol "public: static class... The link error related cpp file looks like:
//myClass.cpp
void myClass::myFunc()
{
myClass::m_nMyVar = 123; //I tried to use this m_nMyVar here and got link error
}
So I add below code on the top of myClass.cpp
//myClass.cpp
int myClass::m_nMyVar; //it seems redefine m_nMyVar, but it works well
void myClass::myFunc()
{
myClass::m_nMyVar = 123; //I tried to use this m_nMyVar here and got link error
}
then LNK2001 is gone.
참고URL : https://stackoverflow.com/questions/195207/unresolved-external-symbol-on-static-class-members
'Programming' 카테고리의 다른 글
객체를 JSON 문자열로 변환 (0) | 2020.07.11 |
---|---|
도끼 삭제 vs 도끼 = 정의되지 않음 (0) | 2020.07.11 |
동적 객체의 멤버를 어떻게 반영합니까? (0) | 2020.07.11 |
$ PATH 변수에서 중복 경로 제거 (0) | 2020.07.11 |
C #에서 올바른 타임 스탬프를 얻는 방법 (0) | 2020.07.11 |