문제

매우 단순히 넣어:

내가 있는 클래스로 구성되어 있는 대부분의 정적 공원,그래서 나는 그와 유사한 기능을 함께는 여전히에서 호출되는 다른 클래스/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이 사라졌습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top