2010-02-02 3 views
10

Sınıfa ++ ilk C programlama öğrencisiyim ve yaptığım son projesi için, C# yapabileceği gibi dizelerden oluşan bir dizi oluşturmak açamadı:C++, dizi dizisinin sabit dizilerini destekliyor mu?

string MONTHS[ARRAY_CAPACITY] = { "Jan", "Feb", "Mar", "April", "May", "June", "July", "Aug", "Sep", "Oct", "Nov", "Dec" }; 
// this yields many compiler errors in C++ 

bunu yapmak mümkün mü C++ benzer bir şey?

Teşekkürler!

+0

ARRAY_CAPACITY nedir? Nasıl ilan edilir? Hangi hatalar (genellikle söylenecek iyi bir şeydir)? Gerçekten bir dizi dize (nesne), c-string dizisi (char dizisi) dizisine gerçekten sahip olmak ister misiniz? – Romain

+0

'#DEFINE ARRAY_CAPACITY 12' –

cevap

14

++ ardından bunun, ayarlanacak bir boyut gerektirmez:

std::string months[] = { "Jan", "Feb", "Mar", "April", "May", "June", "July", "Aug", "Sep", "Oct", "Nov", "Dec" }; 

benim için ++ g ince derler ve ben ediyorum başka bir yerde de derlemesini bekliyoruz. Hatalarınızın std:: ad alanı eksikliğinden kaynaklandığını tahmin ediyorum.

+1

ARRAY_CAPACITY bildirimimde bir kolon eksikti! Rakamlar, buraya yazdığım anda sorunumu çözüyorum. Böyle bir temel soru ile sizi rahatsız ettiğim için üzgünüm. Bana doğru sözdizimini sağladığınız için teşekkürler! – Alex

6

Evet, öyle:

#include <string> 

int main(void) 
{ 
    static const size_t Capacity = 12; 
    std::string Months[Capacity] = { "Jan", "Feb", "Mar", "April", "May", 
             "June", "July", "Aug", "Sep", "Oct", 
             "Nov", "Dec" }; 
} 

Kişisel hatalar muhtemelen başka bir şey ile ilgili idi. std::'u kullanmayı hatırladınız mı? Bilmeden, her şey olabilirdi. Capacity yanlış boyutta mıydı?

Kodunuzun aslında sabit bir dizi olmadığını unutmayın. Şu şekilde: Ayrıca

#include <string> 

int main(void) 
{ 
    static const size_t Capacity = 12; 
    static const std::string Months[Capacity] = { "Jan", "Feb", "Mar", "April", 
/* ^^^^^^^^^^^^ */         "May", "June", "July", "Aug", 
                "Sep", "Oct", "Nov", "Dec" }; 
} 

, diğerleri gösterecektir olarak aslında, Capacity gerekmez ve eğer isterseniz size std::string arayüzünü kaybetmek olsa , const char* kullanabilirsiniz. Eğer C diziyi initialize olursa (birini kabul edeceğiz rağmen)

0

Evet. Derleyici, string'un std::string olduğunu ve {} arasındaki başlatıcıların sayısı ARRAY_CAPACITY'u aşmadığı sürece, soruda kullandığınız sözdizimi doğrudur. Eğer başlık da anlaşılacağı gibi, bir sabit dizisine sahip olmak istiyorsa Tabii

, bunu const ilan etmesi gerekirdi. const olmadan diziniz harici bağlantıya sahip olacak ve birden fazla çeviri birimine dahil edilen bir başlık dosyasına koyarsanız bağlantı hatalarına neden olacaktır.

const std::string MONTHS[ARRAY_CAPACITY] = { "Jan", /* and so on ... */ }; 
2

muhtemelen cstrings bir dizi olacaktır sabit şeritlerinin bir dizi için tercih edilen bir yöntem, ancak

const char* MONTHS[] = { "Jan", "Feb", "Mar", "April", "May", "June", "July", 
    "Aug", "Sep", "Oct", "Nov", "Dec" }; 

, aynı zamanda, std :: dizeleri ile yapılabilir

const string MONTHS[] = { string("Jan"), string("Feb"), ... }; 

Bazı derleyiciler, küme parantezli bir dizi başlattığınızda, char * - std :: string arasında dolaylı dönüşüme izin vermeyebilir; açıkça bir std :: dizesini bir char * 'den yapılandırmak, bunu düzeltecektir.

0

Evet, Visual C++ bunu destekliyor - Ben sadece benzer bir şey yaptım. C++ 'nın diğer sürümleri hakkında emin değilim.

Kitaplığı dahil ettiniz mi? ARRAY_CAPACITY tanımı nedir?

'Yapamaz' derken, derleyici/bağlayıcı hataları mı yoksa başka bir şey mi var?Daha fazla ayrıntı verebilir misiniz?

0

Std :: string kullanmak istediğinizi varsayalım, ancak C++ 'da bu mümkün değil. Ya da en azından bu kadar basit değil. std :: string yerine const char * MONTH [ARRAY_CAPACITY] = {"Jan", ...}; Bu zaten için hile yapabilir.

Eğer std :: string'i kullanmak istiyorsanız STL konteynerine ve destek kütüphanesine (www.boost.org) bir göz atmak isteyebilirsiniz. Özellikle güçlendirmek :: yapmak istediğiniz gibi benzer bir şey yapabilirsiniz atamak.

Selamlar, Michael