2014-03-03 4 views
1

클래스의 정적 변수를 파일에서 전역 변수로 다시 초기화해야하는 이유는 무엇입니까? 그렇지 않으면 연결 오류가 발생합니다. 그 뒤에있는 이론은 무엇입니까? 정적 변수가 데이터 세그먼트에 있음을 이해합니다.클래스의 정적 변수가 연결 오류를 발생시키는 이유는 무엇입니까?

my_class.h

class my_class 
    { 
    public: 
    static int m_fid; 
    void get_fid(); 
    }; 

my_class.cpp :

#include <iostream> 
using namespace std; 
int main() 
{ 
    my_class t; 
/**this gives a linking error */ 
my_class::m_fid = 0; 
return 0; 
} 
+0

을 정의해야합니까? – Beta

+0

범위가 DS에 있습니다. 인스턴스를 생성 할 때 객체는 스택 또는 힙에 놓입니다. 스택 멤버는 스택 또는 힙의 멤버 파트가 될 수 없습니다. 따라서 인스턴스화되지 않습니다. 그러나 C++은 우리가 클래스를 인스턴스화 할 때 그것을 DS에 넣을만큼 지능적이지 않습니다. –

답변

2

우선 정적 변수의 정의가 잘못되었습니다. 당신은 더 이상 링커 오류가 없을 것이라는 점을 수행 할 때 대신 my_class::m_fid = 0; 당신은 .. int my_class::m_fid = 0; 같은 표준에 따라

또 다른 것은 ... 그 범위가 있어야한다 어떻게 생각하십니까

The definition for a static data member shall appear in a namespace 
scope enclosing the member’s class definition. 
+0

이것은 정의가 아니며 함수 내부에 할당되어 있습니다. 'int'를 추가하는 것은 무효합니다; 정규화 된 이름은 로컬 범위에서 선언 할 수 없습니다. – Potatoswatter

+0

그것은 @SHREYAS JOSHI의 의도였습니다. 그래서 우리는'정적 변수 '를 정의 할 필요가 있다는 것을 분명히해야합니다. 정적 변수의 선언 만 클래스 내부에서 발생합니다 ... 희망은 그 위에서 정확합니다 .. – HadeS

+0

"int my_class :: m_fid = 0;"으로 정의해야합니다. 주요 통화 외부. – Subhajit

1

예, static 변수 (그들이 선언 된 곳) 데이터 세그먼트로 이동합니다.

static은 사용되는 장소에 따라 다른 의미를 지닙니다.

  • 파일 또는 네임 스페이스 범위에서이 변수는 .cpp 파일 (번역 단위)에 해당하는 변수임을 나타냅니다.
  • 로컬 범위에서 변수는 해당 범위에만 해당되며 번역 단위에만 적용되거나 inline 함수에있는 경우 번역 단위간에 공유됨을 의미합니다.
  • 클래스 범위에서 클래스 내의 static 멤버 선언은 extern 지정자를 사용하는 클래스 외부의 멤버 선언과 거의 동일합니다.

변수가 extern으로 선언 된 것처럼 정적 멤버는 정의에 도달 할 때까지만 선언 된 것으로 간주되며 정의되지 않습니다.

static conststatic constexpr 멤버의 일부는 예외이며, 해당 멤버는 class 내부에서 초기화 된 다음 즉시 사용되며 멤버의 주소가 절대로 사용되지 않는다는 제한이 있습니다.

+0

그러나 정적 변수가있는 클래스의 객체를 인스턴스화했습니다. 초기화 된 적이없는 것 같습니다. 클래스의 정적 멤버가 해당 클래스 내에서만 범위를 갖고 있다고 말하고 있습니까? 별도로 인스턴스화해야합니다. 하지만 왜 그것이 별도로 인스턴스화되어야합니까? –

+0

@SHREYASJOSHI "인스턴스화"란 무엇을 의미합니까? 정적 멤버는 클래스가 객체를 생성하는 데 사용되는지 여부를 신경 쓰지 않습니다. 그것들은 전역 변수이며 다른 객체와 독립적으로 존재합니다. – Potatoswatter

+0

그럼 왜 우리는 수업 시간에 그들을 묶어 줍니까? –

관련 문제