문제

생성자에 정적 클래스 멤버가 증가했습니다. 규칙에 따라 수업에서 선언되어 외부로 정의됩니다. 이것은 완전히 합법적이어야합니다. 중복 심볼 오류가 발생하는 이유는 무엇입니까?

class Player
{
   private:
      static int numPlayers;
   public:
      Player() { numPlayers++; }
};

int Player::numPlayers = 0;
도움이 되었습니까?

해결책

문제는 선언을 정의에서 분리하지 않는다는 것입니다. 고려하다:

class Player
{
   private:
      static int numPlayers;
   public:
      Player() { numPlayers++; }
};

위의 코드는 단지 클래스 "플레이어"에 "Numplayers"의 존재를 선언합니다. 그러나 공간을 예약하거나 메모리 주소를 변수 "player :: numplayers"에 할당하지 않습니다. 하지만:

int Player::numPlayers = 0;

위의 코드는 정의입니다. 객체 플레이어를위한 공간을 보유하고 있으며 Numplayers를위한 공간을 보유하고 해당 객체의 고유 주소를 지정합니다. 프로그램에서 해당 라인이 두 번 이상 나타나면 1 정의 규칙을 위반합니다. 이제 가장 많이 발생하는 것은이 파일을 포함하고 있다는 것입니다 ...

".c", ".cpp", ".m", ".mm"또는 기타 "소스"파일 (예 : 정의가 포함 된 파일)을 포함하지 않아야합니다. "헤더"파일 만 포함해야합니다 (즉, 순수한 선언이 포함 된 파일). Xcode를 포함한 많은 빌드 시스템의 경우 각 소스 파일이 자동으로 컴파일되어 프로젝트에 연결됩니다. 다른 소스 파일에서 소스 파일을 포함하면 정의는 먼저 자체적으로 컴파일 될 때 두 번 링크 된 다음 다른 소스 파일에서 참조 할 때 다시 연결됩니다.

Xcode에 대해 묻고 있기 때문에 ... 프로젝트 세부 사항보기에서 소스 파일을 선택 취소 하여이 문제를 해결할 수 있습니다. 소스 파일 옆에 체크 마크는 현재 대상에 대해 컴파일되어 연결되어 있음을 나타냅니다. 그러나 ".mm"파일을 확인하고 선언을 넣은 ".h"파일을 만들고 다른 소스 파일을 다른 소스 파일을 포함시키는 대신 ".h"파일을 포함시킬 것을 강력히 제안합니다.

다른 팁

여러 번 정의 했습니까? 즉 헤더 파일에 정의하고 여러 CPP 파일에 포함시킵니다.

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