5

Statik int dizisi olan bir sınıf değişkenine sahip olmam gereken bir kod yazıyorum. Ben, başlık dosyasında böyle bir şey ile Ah bunu anlıyorum: Sonra, ana aşağıdaki gibi bu sadece bir başka dosyada başlık şey dahil olmam durumundastatik dizi sınıf değişkeni "çoklu tanım" C++

#ifndef A_H_ 
#define A_H_ 

class A 
{ 
public: 
    static const int a[]; 
}; 

const int A::a[] = {1,2}; 

#endif 

Bu sadece iyi çalışır. cpp:

#include "A.h" 

#include <iostream> 
using namespace std; 

int main() 
{ 

    A myA; 
    cout << "0: " << myA.a[0] << endl; 
    cout << "1: " << myA.a[1] << endl; 
} 

Ama biraz daha karmaşık olmak benim a sınıfı ihtiyaç varsayalım, ve bir A.cpp yanı dosyasını sahip olmak istiyorum. Aynı benim main.cpp dosyasını tutmak, ancak aşağıdaki gibi sonra (ben sadece bir işlevi, Printa ekledik) Ah değiştireceğiz:

#ifndef A_H_ 
#define A_H_ 

class A 
{ 
public: 
    void printA() const; 
    static const int a[]; 
}; 

const int A::a[] = {1,2}; 

#endif 

Ve sonra dosya A.cpp içinde:

#include "A.h" 

#include <iostream> 
using namespace std; 

void A::printA() const 
{ 

    cout << "Printing in A.cpp." << endl; 
    cout << "A.0: " << a[0] << endl; 
    cout << "A.1: " << a[1] << endl; 

} 

Ao -c Aocc ile Ao derlemesi A'cpp iyidir. Ancak main.cpp (gcc -o atest main.cpp A.o) derlenirken bunu bağlamak “A :: a” nın çoklu tanımıyla başarısız olur.

İnterneti çözümler için inceliyordum ve üstbilgisinde birden çok yerde "birden çok tanım" hatası alan değişkenlerde bulunan değişkenlere sahip kişiler buldum ve çözüm, bildirimde bulunmak için görünüyor. üstbilgide değişken extern, daha sonra sadece bir kaynak (başlıksız) kaynak dosyasında tanımlayın. Ama hem statik hem de harici bir sınıf değişkeni ilan edemem, yapabilir miyim? Eğer dener, ya da sadece extern ilan edersem, değişkenin statik olmadığına dair bir uyarı alırım (her ikisini de denediğimde de "çakışan bir belirleyici" hatası).

Yani, sorum şu: başlık dosyasının birden fazla kaynak dosyasına dahil edilmesi gerektiğinde, statik dizi sınıfı değişkenlerine sahip olmak mümkün müdür? Öyleyse nasıl?

cevap

17

tek tanım kuralını ihlal ediyorsunuz. Bir uygulama dosyasının içinde tanımını taşıyın:

//A.cpp 
#include "A.h" 
const int A::a[] = {1,2}; 

sen extern ile reffering olan çözüm, üye olmayan değişkenler için de geçerlidir. Senin durumunda a bir sınıf üyesidir.

7

"const int A :: a [] = {1,2};" başlık dosyasından satır. Bu tanım satırını .cpp dosyalarından birine koyun. Ardından, başlık dosyasını birkaç kez ihtiyacınız olan yere ekleyebilirsiniz.

İlgili konular