2009-12-29 25 views
6

Öğeleri saklamak istediğim Stuff adlı küçük bir sınıfa sahibim. Bu şeyler int türünün listesidir. Kullandığım her sınıftaki kodum boyunca Stuff sınıfındaki bu şeylere erişmek istiyorum.Sınıfım statik üyeleri olduğunda neden C++ programım bağlantı vermiyor?

main.cpp:

#include "Stuff.h" 

int main() 
{ 
    Stuff::things.push_back(123); 
    return 0; 
} 

Stuff.h:

#include <list> 

class Stuff 
{ 
public: 
    static list<int> things; 
}; 

ama bu kod ile bazı derleme hataları alıyorum:

hata LNK2001: çözülmemiş dış sembol "kamu : statik sınıf std :: liste < int, sınıf std :: ayırıcı > > Stuff :: things "(? Şeyler @ Stuff @@ 2V? $ Liste @ HV? $ Allocator @ H @ std @@@ std @@ A) Ana.obj CSandbox

ölümcül hata LNK1120: 1 çözülmemiş dış kaynak C : \ Stuff \ Projects \ CSandbox \ Debug \ CSandbox.exe CSandbox

Ben bir C# adamım ve bir yan proje için C++ öğrenmeye çalışıyorum. Bence C++ statik üyelere nasıl davrandığını anlamıyorum. Yani lütfen burada neyin yanlış olduğunu açıklayınız.

+0

Politik olarak kod örneğinizi biçimlendirmeye çalıştığınızı söyleyebilir miyim? :-) – stiank81

+0

Nasıl yapılacağını bilseydim, Greg'in benim için –

+0

benim için yeterli olduğunu fark ettim ama cevaplarımı verecektim ve ... 2 yeni cevap. Sadece bildiğim için. – Hai

cevap

15

Bir sınıf bildiriminde statik üyeye değinme, yalnızca bildirimi'dir. Her şeyi düzgün bir şekilde bağlamak için linker için bir tanımına statik eleman eklemeniz gerekir.

#include "Stuff.h" 

list<int> Stuff::things; 

Main.cpp ile birlikte programa Stuff.cpp eklemeyi unutmayın: Normalde bir Stuff.cpp dosyasında aşağıdaki gibi bir şey yer alacak.

+0

@Greg - bu liste olmalıdır Sayfalar :: şeyler; ' –

+0

Teşekkürler, sadece fark ettim ve düzeltildi :) –

7

Statik veri üyeleri, sınıf beyanları dışında, yöntemlere benzer şekilde tanımlanmalıdır.

class X { 
    public: 
     static int i; 
}; 

ayrıca aşağıdaki olmalı

:

Örneğin

int X::i = 0; // definition outside class declaration 
4

Stuff :: şeyler sadece ilan edilir, ancak tanımlı değil.

kullanın:

// Stuff.cpp 
#include "Stuff.h" 

std::list<int> Stuff::things; 

Eklendi: Bu ayrıca iyi bir antrenman birden içerme karşı başlık dosyalarını korumak için:

// Stuff.h 
#ifndef STUFF_H_ 
#define STUFF_H_ 

#include <list> 

class Stuff { 
    public: 
     static std::list<int> things; 
}; 

#endif 
0

Statik üye sınıfta bildirilen lazım ama Gerçekten bulunan birimde (cpp dosyası) tanımlanmıştır.

Tek istisna, sınıfın şablon olması durumundadır: bu durumda, üyeyi sınıfın dışında tanımlamanız gerekir, ancak bunu, başlık dosyasındaki sınıf bildirimi ile de sağlamanız gerekir.

2

Sadece Bilgileriniz için, bu neden C++ 'da tüm global değişkenler (statik global dahil olmak üzere) ana işlevin başlatılmasından önce oluşturulur.

İlgili konular