2016-03-18 27 views
0

Çalıştığım Google aramaları beni programlarında hata yapan kişilere yönlendiriyor. Hatalı koddan geri dönüşten daha doğru bir şekilde nasıl yapılacağını bilmek isterim.C++ sınıf tarafından kullanılacak bir diziyi nasıl bildiririm?

Bir dizim var, const int.

Sınıfımda farklı bir diziyi ancak aynı sayıda öğe ile başlatmak istiyorum.

ilk dizi sıfırlandıktan sonra, sınıfta denedim:

int array[array.length()]; 

Ama derleyici sabit bir ifadesi değildir inliyor.

Ben bile Sonra sonradan sınıf I

const string thestring = "Dummy example"; 
const static int strlen = (int)thestring.length(); 

zaman:

class dostuff { 
    int newstring[strlen]; 
); 

derleyici Hala bana şikayet ediyor.

const string thestring = "Dummy"; 

Sonra sınıfta, sadece elle elemanları saymak:

Bu bana örn ilan ediyorum ilk çalışırken bırakır

class Enigmatise { 
    int duplicatelengthstring[5]; // Just counted by hand. :-(
); 

derleyici sabit bir ifade var şimdi mutlu ama mutlu değilim çünkü ilke dizgisinin tanımını "Daha fazla karakter" olarak değiştirirseniz, o zaman onları el ile saymak ya da onları .length() ile karıştırmak ve sonra yeni bir sabit kullanmak Sınıfta sayısal ifade, hepsini el ile yapıyor. Bu kaza eğilimli görünüyor.

Bu nedenle, bir

const string thestring = "Dummy example"; 

nasıl o zaman sınıfın içinde emzik için, bir sınıfta, eşit uzunlukta başka dizi ilan ediyorum varsa?

cevap

0

Dinamik ayırmayı kullanabilirsiniz;

class anotherclass { 
     const std::string thestring; 
     int * const otherArray; 

     anotherclass() : thestring("some string"), 
         otherArray(new int[(int)thestring.length()]){} 
     ~anotherclass(){delete[] otherArray;} 
    }; 

DÜZENLEME: Bu uyarı olmadan derler

class anotherclass {   
    static const std::string thestring; 
    static const int strlen; 
    public: 
    void dosomething(){int g[strlen]; } 
}; 


const std::string anotherclass::thestring = "mystring"; 
const int anotherclass::strlen = anotherclass::thestring.length(); 
+0

sen/kullanarak bir şey atlatmanın mümkün olabilir C++ altında 11 dinamik ayırmayı kullanabilirsiniz 'constexpr istemiyorsanız Ama emin değilim. – xvan

+0

Bir girişim yaptım, ancak 'std :: basic_string ', bir tamsayı değil. Bu nedenle, yapamayız: 'constexpr std :: string's,' std :: basic_string kullanın :: operator [] 'veya' size() '' constexpr' işlevini kullanın veya 'c_str kullanın) 'Constexpr' fonksiyonunda temel C dizgesini elde etmek ve oradan uzunluğu kontrol etmek. Ayrıca, '' (x)/sizeof (x [0]) deyiminin olmasının işe yaramayacağı; dize ile kullanıldığında, "13" yerine "32" olarak değerlendirir. Muhtemelen bunu yapmanın bir yolu var, ama ne olduğunu anlamaya yetecek kadar yetenekli değilim. –

+0

Bir C dizesi kullanıyor olsaydı yapmak kolay olurdu; N4121 nolu kağıtta önerildiği gibi 'string_literal' da yardımcı olacaktır, ama eğer bir şey varsa, bunun ne olduğunu bilmiyorum. Şu anda aklıma gelen en iyi şey, "literal_str" (https: //www.daniweb) gibi bir derleme zamanı dize sınıfı yapmaktır.com/programming/software-development/code/482276/c-11-compile-time-string-birleştirme-constexpr ile) ve bir 'constexpr size_t size() işlevini verin. Gerekirse, 'std :: string' ile kullanmanın bir yolunu da yapması gerekiyordu. Dürüstçe, aksi takdirde boyutu almak için 'constexpr' kullanmayı bilmiyorum. –