2014-07-09 4 views
0

휴대 전화의 정적 컬렉션에 자신을 추가하기 위해 생성 된 클래스 Phone이 필요합니다. 인스턴스의 정적 컬렉션 C++?

static vector < class Phone* > instances; 

그리고 나는이 할 생성자

:

Phone::instances.push_back(this); 

을하지만 링커가 확인되지 않은 외부 기호를 던졌습니다, 그 이유는 그래서 컬렉션이? 내가 도대체 ​​뭘 잘못하고있는 겁니까? 비슷한 질문을 찾지 못했습니다. 인스턴스를 생성자 외부에 추가해야합니까? 아니면 다른 클래스의 컬렉션을 가져야합니까? 고맙습니다.

답변

3

정적 멤버를 클래스 외부에 선언해야합니다. 헤더에서

: 그것을 귀하의 질문에, 또한 단지 보조 노트가 아닌 직접적인 답을

//on global or namespace scope 
vector <Phone*> Phone::instances; 
+0

덕분에 @shr, 나는 그것을 이미 얼마 전에 나 한테 일어난 생각, 왜 그? 어디서든지 주제에 대해 더 읽을 수 있습니까? 고맙습니다! –

+1

변수는 주로 소스 파일에서 선언됩니다. 정적 멤버는 어딘가에 선언해야합니다. 헤더에 선언하면 헤더를 포함한 각 소스의 변수가 선언되고'already defined' 링크 오류가 발생합니다. 그래서 헤더 파일에 변수를 선언하지 않는 것입니다. (정적 파일이 아닌 경우 각 소스 파일마다 다른 로컬 파일과 관련이 있으며 대상과 관련이 없음) – SHR

0

: 당신의 cpp에있는

class Phone{ 
... 
static vector < class Phone* > instances; 
... 
}; 

당신은 그것의 인스턴스를 생성해야 원시 포인터보다는 "std :: shared_ptr"의 벡터를 갖는 것이 더 낫습니다. 그러나 std :: shared_ptr의 벡터 인 경우 벡터에 "this"를 추가 할 수 없으므로 래핑 된 클래스에서 "this"에 액세스 할 수있는 클래스에 한 가지 더 추가해야합니다 에서 표준 : : shared_ptr. 여기에 당신이 할 수있는 것입니다 :

class Phone : public std::enable_shared_from_this<Phone> 
{ 
    static vector<std::shared_ptr<Phone>> instances; 
} 

//then somewhere in your code: 
Phone::instances.push_back(shared_from_this()); 

그리고 당신의 .cpp 파일에

:

vector<std::shared_ptr<Phone>> Phone::instances; 
+0

멋지지만 shared_ptrs에 대해 잘 모르는 이유는 무엇입니까? 나는 그것을 온라인으로 읽어야한다고 생각한다. P –

+1

잘 참조하는 이유는 그것이 더 나은 이유이다. 생성 된 객체를 가리키는 shared_ptrs가 없 자마자 자동으로 파괴됩니다. 따라서 수동으로 삭제하는 것에 대해 걱정할 필요가 없습니다. – armanali