되지 않은 외부 기호에서 정전류 구성원
문제
매우 단순히 넣어:
내가 있는 클래스로 구성되어 있는 대부분의 정적 공원,그래서 나는 그와 유사한 기능을 함께는 여전히에서 호출되는 다른 클래스/functions.
어쨌든,내가 정의된 두 static unsigned 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 부재를 가진 해결되지 않은 외부인"을 검색 할 때 저에게 나오는 첫 번째 스레드이므로 여기에 미해결 외부의 문제를 해결하기 위해 또 다른 힌트를 남겨 두겠습니다.
나를 위해, 내가 잊어 버린 것은 내 수업 정의를 표시하는 것이 었습니다. __declspec(dllexport)
, 그리고 다른 클래스에서 전화를 걸었을 때 (해당 클래스의 DLL의 경계 외부), 물론 해결되지 않은 외부 오류를 얻었습니다.
그럼에도 불구하고 내부 도우미 클래스를 다른 곳에서 액세스 할 수있는 클래스로 변경할 때 잊기 쉽기 때문에 동적으로 연결된 프로젝트에서 작업하는 경우도 확인할 수도 있습니다.
제 경우에는 .h 파일에 하나의 정적 변수를 선언했습니다.
//myClass.h
class myClass
{
static int m_nMyVar;
static void myFunc();
}
그리고 myclass.cpp에서 나는이 m_nmyvar를 사용하려고 노력했다. 다음과 같은 링크 오류가 발생했습니다.
오류 LNK2001 : 해결되지 않은 외부 기호 "공개 : 정적 클래스 ... 링크 오류 관련 CPP 파일은 다음과 같습니다.
//myClass.cpp
void myClass::myFunc()
{
myClass::m_nMyVar = 123; //I tried to use this m_nMyVar here and got link error
}
그래서 나는 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
}
그런 다음 LNK2001이 사라졌습니다.