SORU
11 Mart 2012, Pazar


Neden't olmayan sabit başlatılamadı ben sınıfta üyesi veya statik bir dizi statik?

Neden olmayan sabit başlatmak edemem Sınıf static üye veya static dizi?

class A
{
    static const int a = 3;
    static int b = 3;
    static const int c[2] = { 1, 2 };
    static int d[2] = { 1, 2 };
};

int main()
{
    A a;

    return 0;
}

derleyici sorunları hataları aşağıdaki:

g   main.cpp
main.cpp:4:17: error: ISO C   forbids in-class initialization of non-const static member ‘b’
main.cpp:5:26: error: a brace-enclosed initializer is not allowed here before ‘{’ token
main.cpp:5:33: error: invalid in-class initialization of static data member of non-integral type ‘const int [2]’
main.cpp:6:20: error: a brace-enclosed initializer is not allowed here before ‘{’ token
main.cpp:6:27: error: invalid in-class initialization of static data member of non-integral type ‘int [2]’

İki sorum var:

  1. Neden static Veri üyeleri başlatmak istemiyorum sınıfta?
  2. Neden static sınıfta diziler başlatmak istemiyorum, const hatta dizi?

CEVAP
11 Mart 2012, Pazar


Neden static veri üyeleri başlatmak istemiyorum sınıfta?

C standardı sadece statik ayrılmaz ya da numaralandırma sabiti tipleri sınıfı içinde başlatılmasını sağlar. Bu a diğerleri ise başlatılması için izin nedeni budur.

Referans:
C 03 9.4.2 Statik veri üyeleri
§4

Eğer statik veri üyesi ayrılmaz ya inş inş numaralandırma türü ise, sınıf tanımı bildiriminde integral sabiti ifadesi (5.19) yapılacak sabit başlatıcı bir belirtebilirsiniz. Bu durumda, üye integral sabiti ifadeler görünebilir. Üye hala program içinde kullanılan bir ad alanı kapsamı belirlenmeli, ad kapsamı tanımını bir başlatıcı bulunamaz.

İntegral çeşitleri nelerdir?

C 03 3.9.1 Temel türleri
§7

Tip bool, char, wchar_t, imzalı ve imzasız tamsayı türleri topluca ayrılmaz türleri olarak adlandırılır.43) bir tamsayı türü için eşanlamlı tamsayı türüdür.

Dipnot:

43)Bu nedenle, Listeleme (7.2) ayrılmaz bir parçasıdır; ancak, numaralandırma 4.5'de belirtildiği gibi int, işaretsiz tamsayı, uzun, ya da uzun imzasız, terfi olabilir.

Çözüm:

Bu kullanabilirsiniznumaralama numarasınıf tanımı içinde bir dizi başlatmak için.

class A 
{
    static const int a = 3;
    enum { arrsize = 2 };

    static const int c[arrsize] = { 1, 2 };

};

Neden Standart buna izin vermiyor mu?

Bjarne uygun bir şekilde bu açıklarhere:

Bir sınıf genellikle bir başlık dosyasında bildirilen ve üstbilgi dosyası genellikle birçok çeviri birimleri dahil. Ancak, karmaşık bağlayıcı kurallar önlemek için, C) her nesnenin benzersiz bir tanımı vardır gerektirir. Bu kural eğer C sınıfının nesneleri olarak hafızasında kayıtlı olması gereken varlıklar tanımı izin kırılır.

Neden static const integral tip & çeteleler sadece sınıf Başlatma izin veriliyor?

Cevap Bjarne alıntı yakından okumak, gizli
"C) her nesnenin benzersiz bir tanımı vardır gerektirir. Bu kural eğer C sınıfının nesneleri olarak hafızasında kayıtlı olması gereken varlıklar tanımı izin kırılır."

static const sadece tamsayı sabitler derleme olarak tedavi edilebilir olduğunu unutmayın. Derleyici tamsayı değeri her zaman ve dolayısıyla kendi sihir ve iyileştirmeler uygulayabilirsiniz değişmez bilir, derleyici sadece bu sınıfın üyeleri ben inlines.e, hafızasında kayıtlı olması gerekiyor kaldırılır, bellek Gibi artık saklı değil, bu değişkenler Bjarne tarafından belirtilen kuralın istisnası verir.

Kayda değer static const integral değerleri Sınıf Başlatma varsa bile, bu değişkenlerin adresini almaya izin olmadığını burada not etmek önemlidir. Out-of-sınıf bir tanımı vardır statik bir üye ise (ve yalnızca) adresi alabilir.Bu da yukarıdaki mantık doğrular.

çeteleler numaralandırılmış türdeki değerlere değer vermez beklenen yerlerde kullanılabilir, çünkü bu izin verilir.alıntı yukarıya bakın


Nasıl C 11'de bu değişir mi?

C 11 belli ölçüde kısıtlama rahatlatır.

C 11 9.4.2 Statik veri üyeleri
§3

Eğer statik veri üyesi inş edebi tür ise, sınıf tanımı bildiriminde belirtebilirsinizbrace-veya-eşit-başlatıcıher şekildebaşlatıcı maddebiratama ifadesisürekli bir ifadesidir. Edebi tür statik veri üyesi constexpr specifier; ile sınıf tanımı eğer bildirilebilir, beyan bir belirtecektirbrace-veya-eşit-başlatıcıher şekildebaşlatıcı maddebiratama ifadesisürekli bir ifadesidir. [ Not: her iki durumda da, üye sabit ifade görünebilir. —son not ] üye hala program içinde kullanılan bir ad alanı kapsamı belirlenmeli, ad kapsamı tanımını bir başlatıcı bulunamaz.

Ayrıca, C 11(§12.6.2.8) olduğu bildirildi başlatılması için statik olmayan veri üyesi(kendi sınıfında) izin verir. Bu çok kolay bir kullanıcı anlambilim anlamına gelecektir.

Bu özellikler henüz son hala bir derleme hatası alabilirsiniz o Yüzden 4.7, gcc uygulanmıştır unutmayın.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • PhoneArena

    PhoneArena

    7 NİSAN 2006
  • Project Mooncircle

    Project Moon

    6 Aralık 2009
  • XxMinayaxX1

    XxMinayaxX1

    9 Mayıs 2012