2008-11-12 22 views
21

Bu, diğer sorularla ilgilidir, örneğin: this ve diğer sorularımın bazıları.Dizileri C++ üstbilgisinde nasıl bildirirsiniz?

this question yılında

ve diğerleri, biz örneğin, biz bir güzel adımda dize diziler de tanımlanabilir ve ilklendirebilirsiniz bkz:

const char* const list[] = {"zip", "zam", "bam"}; //from other question 

Bu, hiçbir zahmet ile bir fonksiyonun uygulanması yapılır, ya da olabilir Herhangi bir kapsam dışında bir .cpp dosyasının gövdesi. derleyici şikayet ve çalışmak için görünmüyor,

class DataProvider : public SomethingElse 
{ 
    const char* const mStringData[] = {"Name1", "Name2", "Name3", ... "NameX"}; 

public: 
    DataProvider(); 
    ~DataProvider(); 

    char* GetData() 
    { 
     int index = GetCurrentIndex(); //work out the index based on some other data 
     return mStringData[index]; //error checking and what have you omitted 
    } 

}; 

Ama: Yapmak istediğim ne

Ben kullanıyorum bir sınıfın üyesi böyle bir şey olduğu kadar bu gibi bir dizi sahip olmaktır neden dışarıda. Bir sınıf tanımında bir adımda böyle bir dizi bildirmek ve başlatmak mümkün mü? Daha iyi alternatifler var mı?

Bunun çok amatör bir hata olduğuna eminim, ama her zaman olduğu gibi, yardım ve tavsiyeniz çok takdir ediliyor.

alkış

Xan

+0

"implimentation" yazılmalıdır "uygulama" –

cevap

18

dizi sınıfın statik üyesi olmak için anahtar kelime statik ve dış başlatma kullanın: başlık dosyasında

: In

class DataProvider : public SomethingElse 
{ 
    static const char* const mStringData[]; 

public: 
    DataProvider(); 
    ~DataProvider(); 

    const char* const GetData() 
    { 
     int index = GetCurrentIndex(); //work out the index based on some other data 
     return mStringData[index]; //error checking and what have you omitted 
    } 

}; 

.cpp dosyası:

const char* const DataProvider::mStringData[] = {"Name1", "Name2", "Name3", ... "NameX"}; 
+0

Diziye başlık bildirimi içinde bir boyut vermeniz gerekir. – mbyrne215

+0

Emin misin? Benim için iyi çalışıyor (Visual C++ 2005) ve daha önce birkaç kez kullanıyorum. Standartta tanımlanmayan bir davranış olmadıkça (şimdi bakmayacağım), çalışacağına inanıyorum. –

+0

Başlatıcıyı kullanırken sorun yok. Derleyici, boyutu, başlatıcıdaki öğe sayısına göre hesaplar. –

3

Bu C++ mümkün değildir. Diziyi doğrudan başlatamazsınız. Bunun yerine bunu o (sizin durumunuzda 4) sahip olacaktır boyutunu vermek zorunda ve DataProvider'ın kurucusundaki diziyi başlatmak zorunda: Eğer const-lik vazgeçmek zorunda

class DataProvider { 
    enum { SIZEOF_VALUES = 4 }; 
    const char * values[SIZEOF_VALUES]; 

    public: 
    DataProvider() { 
     const char * const v[SIZEOF_VALUES] = { 
      "one", "two", "three", "four" 
     }; 
     std::copy(v, v + SIZEOF_VALUES, values); 
    } 
}; 

Not Dizideki işaretçilerden, doğrudan diziyi başlatamadığınız için. Ancak, daha sonra işaretçileri doğru değerlere ayarlamanız gerekir ve böylece işaretçilerin değiştirilebilir olması gerekir. Statik dizi olması tüm nesnelerin bu diziyi paylaşacak demektir

/* in the header file */ 
class DataProvider { 
    enum { SIZEOF_VALUES = 4 }; 
    static const char * const values[SIZEOF_VALUES]; 
}; 

/* in cpp file: */ 

const char * const DataProvider::values[SIZEOF_VALUES] = 
    { "one", "two", "three", "four" }; 

: Dizideki değerleriniz yine const ise

, tek yol statik bir dizi kullanmaktır. Böylece hafızayı da kaydedeceksin.

+1

_ büyük olasılıkla sadece nesne yönelimli programlama temel ilkelerini tehlikeye da demektir _ "statik dizi olması tüm nesnelerin bu diziyi paylaşacak anlamına gelen" . –

3

nedeni böyle dizinizi beyan edemez (const char * []) ​​olmasıdır:

  • sınıf bildiriminde başlatıcıları var ve bu yüzden
  • sözdizimi olamaz const char* [] Derleyici, her örnek için ne kadar alan ayırması gerektiğini belirtmez (dizininiz örnek değişken olarak bildirilir).

Ayrıca, muhtemelen bu diziyi statik yapmak istersiniz, çünkü özde sabit bir değerdir.

+0

Aslında, const char * [] '_does_, derleyicinin her bir örnek için ne kadar yer ayırması gerektiğini belirtir - belleğe yalnızca bir işaretçi. Bu, statik olmayan değişkenler için gerçekten _why_ statik dizi bildirimlerine izin verilmez; her yeni örnek için fazladan bellek ayırma gerektirir ve bu tür bir işlem yükü geleneksel olarak kurucularda açıkça ele alınır. – meustrus