2009-04-06 14 views
15

Bir sınıf veri üyesini başlatmak için doğru yer neresidir?Sınıf değişkenlerini başlatmak için doğru yer?

Foo.h:

class Foo { 
private: 
    int myInt; 
}; 

Sonra gelen .Cpp dosyasında myInt bir değer ayarlamak için deneyin:

Foo Böyle bir başlık dosyasına sınıf beyanı bulunmaktadır. cpp:

int Foo::myInt = 1; 

myInt'i yeniden tanımlamak için bir derleyici hatası alıyorum. Neyi yanlış yapıyorum???

cevap

28

Orada sahip olduğunuz örnek değişkenidir. Sınıfın her bir örneği kendi myInt kopyasını alır. Bu başlatmak için burası bir yapıcı içinde: sınıfının her örneği tarafından paylaşılan tek bir kopyası olduğu

class Foo { 
private: 
    int myInt; 
public: 
    Foo() : myInt(1) {} 
}; 

A sınıfı değişkendir biridir. Denediğin gibi bunlar başlatılabilir.

class Foo { 
private: 
    static const int myInt = 1; 
}; 

Bu bütün örnekleri tarafından paylaşılan tek değerdir: Ayrıca sağ sınıf tanımının bir static const başlatılıyor seçeneğine sahip, ayrılmaz değerler için

(sözdizimi için JaredPar cevabını bakınız) değiştirilemeyen sınıf.

+2

Merhaba, Foo(): myInt (1) {} sözdiziminin adının ne olduğunu söyler misiniz? Bu yüzden Google'ı kullanabilir ve daha ayrıntılı olarak okuyabilir miyim? 'public: Foo() {myInt = 1; } '? – SexyBeast

+5

@Cupidvogel: "Üye Başlatıcı Listeleri" (http://en.cppreference.com/w/cpp/language/initializer_list) – Eclipse

1

Bir sınıf değişkeni "statik" olarak işaretlenmelidir. Değişkeniniz bir sınıf değişkeni değilse ve bir sınıf değişkeni değilse, kurucuda veya başka bir yöntemde başlatmanız gerekir.

4

Statik başlatma yapısı aracılığıyla bir örnek üye başlatmaya çalışıyorsunuz. Bunun bir sınıf düzeyi değişkeni (statik) olmasını istiyorsanız, değişkeni statik anahtar sözcüğün önüne koyun.

class Foo { 
private: 
    static int myInt; 
}; 
+0

Teşekkür bakın! "Sınıf düzeyi bir değişken" olduğunu varsayıyorum, sadece bir sınıf içinde ve başka hiçbir yerde kullanılamaz? –

+0

@draftomatic, sınıf düzeyi değişkenine göre, sınıfın bir örneği ile ilişkilendirilmemiş bir anlam ifade eder. Sadece Foo (ve arkadaş) içinde sadece Foo :: myInt diyebilirsiniz. Hiçbir Foo örneği gerekli değildir. – JaredPar

10

Jared'in cevabını genişletmek için, şimdi olduğu gibi başlatmak isterseniz, bunu Oluşturucu'ya koymanız gerekir.

class Foo 
{ 
public: 
    Foo(void) : 
    myInt(1) // directly construct myInt with 1. 
    { 
    } 

    // works but not preferred: 
    /* 
    Foo(void) 
    { 
     myInt = 1; // not preferred because myInt is default constructed then assigned 
        // but with POD types this makes little difference. for consistency 
        // however, it's best to put it in the initializer list, as above 
        // Edit, from comment: Also, for const variables and references, 
        // they must be directly constructed with a valid value, so they 
        // must be put in the initializer list. 
    } 
    */ 

private: 
    int myInt; 
}; 
+0

+1 yöntemini açıklayan, avantajları/dezavantajları açıklayan ve terminolojisini açıklayan "başlatıcı listesi" (bir kurucuda kabul edilen yanıtın tanımından çok farklı olan) diğer dillerden gelen programcılara "yapıcıda" yapıcının küme parantezleri arasındadır.Ve bu cevap benim için hepsini topladı. –

İlgili konular