정적 클래스 멤버에서 해석되지 않은 외부 기호


129

간단히 말해서 :

대부분 정적 공용 멤버로 구성된 클래스가 있으므로 다른 클래스 / 함수에서 여전히 호출해야하는 유사한 함수를 함께 그룹화 할 수 있습니다.

어쨌든, 클래스 공용 범위에서 두 개의 정적 부호없는 char 변수를 정의했습니다. 같은 클래스의 생성자에서 이러한 값을 수정하려고 할 때 컴파일 할 때 "해결되지 않은 외부 기호"오류가 발생합니다.

class test 
{
public:
    static unsigned char X;
    static unsigned char Y;

    ...

    test();
};

test::test() 
{
    X = 1;
    Y = 2;
}

저는 C ++을 처음 사용하므로 쉽게 사용할 수 있습니다. 왜 이렇게 할 수 없습니까?

답변:


145

X와 Y의 선언과 일치하도록 정의를 추가하는 것을 잊었습니다.

unsigned char test::X;
unsigned char test::Y;

어딘가에. 정적 멤버를 초기화하고 싶을 수도 있습니다.

unsigned char test::X = 4;

그리고 다시, 선언이 아닌 정의 (보통 CXX 파일에서)에서 수행합니다 (종종 .H 파일에 있음)


4
당신이 헤더 전용 라이브러리를 작성하는 경우, 당신은 CPP 파일을 피하기 위해이 기술을 사용할 수 있습니다 stackoverflow.com/questions/11709859/...
Shital 샤

62

클래스 선언의 정적 데이터 멤버 선언은 정의가 아닙니다. 그것들을 정의하려면 .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.
}

.CPP에서 왜 "unsigned char test :: X = 1;" "test :: X = 1;"대신에? 정적 변수 X가 이미 정의되어 있는데 왜 여전히 "서명되지 않은 문자"가 필요한가? @sergtk
페니

"test :: X = 1;"때문에 @Penny 우리가하려고하는 것은 정의입니다.
익명 1847

4

이것은 일반적으로 "정적 const 멤버를 가진 해결되지 않은 외부 요소"를 검색 할 때 나에게 보이는 것처럼 보이는 첫 번째 SO 스레드이므로, 해결되지 않은 외부 장치의 한 가지 문제를 해결하기위한 또 다른 힌트를 남길 것입니다.

나에게 잊어 버린 것은 클래스 정의를 표시하는 것이 었으며 __declspec(dllexport)다른 클래스 (클래스의 dll 경계 외부)에서 호출 할 때 물론 해결되지 않은 외부 오류가 발생했습니다.
내부 헬퍼 클래스를 다른 곳에서 액세스 할 수있는 클래스로 변경할 때 잊어 버리기 쉬우므로 동적으로 연결된 프로젝트에서 작업하는 경우에도 확인할 수 있습니다.


2

내 경우에는 .h 파일에 하나의 정적 변수를 선언했습니다.

//myClass.h
class myClass
{
static int m_nMyVar;
static void myFunc();
}

myClass.cpp 에서이 m_nMyVar를 사용하려고했습니다. 다음과 같은 LINK 오류가 발생했습니다.

오류 LNK2001 : 해결되지 않은 외부 기호 "public : static class ... 링크 오류 관련 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이 사라졌습니다.


0

제 경우에는 잘못된 연결을 사용하고있었습니다.
C ++ (cli)로 관리되었지만 기본 내보내기 기능이 있습니다. 링커-> 입력-> 어셈블리 링크 리소스에 함수를 내보내는 라이브러리의 dll을 추가했습니다. 그러나 네이티브 c ++ 연결에는 cpp의 구현을 올바르게 "보기"하기 위해 .lib 파일이 필요하므로 .lib 파일을 링커-> 입력-> 추가 종속성에 추가하는 데 도움이되었습니다.
[일반적으로 관리되는 코드는 dll 내보내기 및 가져 오기를 사용하지 않고 참조를 사용하지만 고유 한 상황입니다.]

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.