2013-05-09 20 views
5

İnternette aradım ve bazı kişilerin statik olmayan üye işlevinin statik üye işlevine veya verilere erişebileceğini söylediğini fark ettim. Sonra doğrulamak için bir program yazdım.Statik olmayan üye işlev erişimi statik üye işlevi veya verileri olabilir mi?

#include <iostream> 
class test 
{ 
public: 
    static int a; 
    void printa() 
    { 
     std::cout<<a; 
    } 
}; 

int main(int argc, const char * argv[]) 
{ 
    test m; 
    m.printa(); 

    return 0; 
} 

Kod, linker hataları üretir! bir sınıf içinde static olarak bir değişken tanımlama

Undefined symbols for architecture x86_64: 
    "test::a", referenced from: 
     test::printa() in main.o 
+0

olası yinelenen http: // stackoverflow.com/sorular/8612206/bağlayıcı-hata-zaman-kullanma-statik-üyelerini) – AnT

+0

İşte benzer bir sorundur ve çözümü [İşte] olduğu [1] [1]: http: // stackoverflow .com/questions/8034568/undefined-symbols-architecture-x86-64-of-architecture-should-i-use – Uahmed

+0

olası yinelenen [Özel statik üyelerin başlatılması] (http://stackoverflow.com/questions/185844/initializing-private-static-members) –

cevap

7

de, sadece bir beyan vardır. yanı değişkeni tanımlamak için

Tek bir derleme ünitesinde bu satırı ekleyerek, yani gerekir:

int test::a = 0;

daha kesin olmak gerekirse: Bir derleme birimi temelde bir .cpp dosyasıdır. Bu satırı doğrudan bir başlık dosyasına koymak için girmemelisiniz, aksi halde tersi bir hata alacaksınız: "çoklu tanım ...".

Ayrıca, tahmin ettiğiniz gibi, programınız başladıktan sonra değişkeninizi 0'a başlatabilirsiniz.

Bu satırı sınıf bildiriminiz altına koyarsanız, sorununuzu giderir (bu özel durumda: bunu bir başlık dosyasında yazmamaya dikkat edin).

+2

ekleyerek "bir başlık dosyasına koymayın", çünkü herkes "derleme birimi" nin ne anlama geldiğini bilemez. – Elazar

+1

İyi nokta. Bunu cevabıma ekleyeceğim. – Nbr44

0

Statik veri üye örneğini tanımlamanız gerekir. class test olarak ve class test 'ın tanımından sonra aynı ad kapsamında temelde her yerde doğrudan ... main() altında ...

int test::a; 
main() Yukarıdaki

... ya da bir satır ekleyin. Yalnızca, test::a ilan ettik çünkü bu

+0

, nerede tanımlanacağı önemli değil. – Elazar

+0

@Elazar: bu döngüsel bir argüman, çünkü yasadışı bir yere koymaya çalışırsanız, tanımlanmayacaktır; “Ana” kelimesinin öneri, bir tanımın “ana()' içinde (başka bir beyanı teşkil eder), ne de “sınıf testi” nin içinde ya da içinde yer almamasını * garanti etmekti… –

+0

@elazar tamamen doğru. Sınıfın beyan edildiği üyenin beyanı görünür olmalıdır. – jrok

2

değil bunu tanımlamıştır:

#include <iostream> 
class test 
{ 
    ... 
}; 

int test::a = 1; //Needs a definition! 
1

Yalnızca static veri üyesini ilan etmişlerdir. Tanımlamadınız. Tanımlamak için int test:: a; gibi bir şey yapmalısınız.

çok

statik olmayan üyelerinin statik veri üyeleri erişmesine izin verilen this bakınız. Biz sınıfta o zaman sınıf dışında tanımlamak zorunda statik bir üyesini oluştururken statik üyeler herhangi bir nesne

1

ait olmayan çünkü ters izin verilmez. sadece tanımlamak için özledin, linker hatası almanın sebebi budur.

class Animal 
{ 
    static int leg; 
    int Data; 
    public: 
     int Display(); 

}; 

int Animal::leg=20; // Need to define the static member 

int Animal::Display() 
    { 
     cout<<"A static value :"<<leg<<endl; 
     leg =40; 
     cout<<"A static value :"<<leg<<endl; 
    } 


int main(int argc, char** argv) 
{ 
Animal a; 
a.Display(); 
return 0; 
} 

fazla ayrıntı için bu blogu bkz: [statik üye kullanırken Bağlayıcı hatası] (içinde
http://www.aticleworld.com/

İlgili konular