SORU
18 ŞUBAT 2011, Cuma


Eğer C-C Tarzı projemde yayınları, C yayınları için yeniden düzenleme değer mi?

C-stil 15K LOC C: proje, 'ı çocuk ve temel sınıflar arasındaki atmalarını kez atmalarını kullanıyorum.

Kötü alıyor ve ciddi hatalara neden olabilir okudum bile, C atmalarını olarak güvenli bir tip değil gibi, halahissediyorummükemmel ve kullanımı gayet rahat.

Örneğin, yanlışlıkla yanlış yazmış C-Style cast sebebi bu benim projem şu ana kadar tek bir hata - çok tecrübeli değil.

Onları kullanıyorum iki ana nedeni vardır:

  • Onları yeteri kadar bilmiyordum
  • Kendi sözdizimi hoşuma gitmedi, daha ayrıntılı ve benim için okumak zor

Soru:

  • (Neden) benim proje yeniden oluşturulması Gerekiyor C kullanma tarzı atmalarını?
  • Neden tarzı benim gelecekteki projeler için atmalarını C kullanmalıyım?

İyi gibi sanal ve soyut temel sınıflar, ad, STL gibi C bana sunduğu tüm diğer avantajları, OOP, yeni tür sözdizimi sadece döküm değil. ". Argüman ^em>Neden sonra C değil mi?" benim için çalışmıyor.

CEVAP
18 ŞUBAT 2011, Cuma


C avantajı tarzı bahsettiğiniz gibi, yazın güvenlik atmalarını. Her bir döküm içinde C işler belirli bir tür dönüşüm (ya da bir aile ile ilgili dönüşüm) ve derleyici gidebilir ve kontrol değilsin yanlışlıkla yaparak daha fazla dönüşüm olduğunu düşündüğünüz, ya da bir sıra dönüşümler temelde, güvende değiliz.

Bir şey düşünmek için bu yaparken harika hissediyorum rahat kullanma C-stil atmalarını, ve yaparken çok etmedin yapılan herhangi bir hata ile onları, diğer insanlar üzerinde çalışıyoruz kod tabanı olmayabilir gibi kolay olan bu atmalarını. Döküm operatörleri kullanarak kodu daha belgeleyen kendi kendine yapar. Eğer varsa C-tarzı bir yere döküm varsa, başka birinin kodu okuma yaptığın şeyin ne olduğunu hemen anlaması mümkün olmayabilir. Eğer görürlerse bir şey gibi

T* ptr = (T*) var;

Derhal bu olduğunu söylemek mümkün olmayabilir

  1. Türetilmiş bir sınıf için bir temel sınıf ya da tam tersi bir döküm.
  2. constşerit döküm var ness
  3. Bir işaretçi için ayrılmaz bir türü için bir atama.

Muhtemelen bağlamında bu ulaşabiliyorlar onlar gibi bir cast kullanırsanız çok daha belirgin ne oluyor

T* ptr = static_cast<T*>(var);

ya

T* ptr = const_cast<T*>(var);

C-stil operatörleri döküm tercih için başka bir neden kodu değiştirmek için daha esnek olun. Örneğin, bu fonksiyonu olduğunu varsayalım:

void DoSomething(Base* ptr) {
    Derived* derived = (Derived *) ptr;
    DoSomethingElse(derived);
}

Şimdi, bu işlevi const işareti karar argüman herhangi bir değişiklik yapmak gerekiyordu, değil mi fark ettiğimi varsayalım. Örneğin:

void DoSomething(const Base* ptr) {
    Derived* derived = (Derived *) ptr;
    DoSomethingElse(derived);
}

Ama şimdi bir sorunumuz var - sadece bir mahzun yapmak için kullanılan C-stil alçımı şimdi de constlik şeritler kapalı. Bu DoSomething yöntem bunu yapmak için değil, kendisi vaat ediyor olsa da DoSomethingElse ben pass işaretçi mutasyona kolay nerede hata yol açabilir. Eğer yerine yazdım bu kodu

void DoSomething(Base* ptr) {
    Derived* derived = static_cast<Derived *>(ptr);
    DoSomethingElse(derived);
}

Ve sonra const ekleyerek kodu değiştirin:

void DoSomething(const Base* ptr) {
    Derived* derived = static_cast<Derived *>(ptr);
    DoSomethingElse(derived);
}

Şimdi alırım bir derleyici hata bana benim eski döküm kırık, neden beni keşfetmek için başka bir mantıksal hata kodu (yani DoSomethingElse mutasyona argüman, ben safça yapmak ptr işaretçiconst.

Yani Kısacası, C döküm operatörleri kullanarak kodu daha okunabilir ve daha sürdürülebilir hale getirir. Kod mantığı daha açık yapar. Ve kod daha az eğilimli hata derleyici ya da geri gitmek gibi bunları yapıyorsun ya sonra hataları yakalamak ve eski kodunu değiştirmek suretiyle yapar. C -tarzı bu nedenden dolayı gelecekte operatörleri döküm kullanmaya çalışıyorum tavsiye ederim.

Geri dönün ve mevcut değiştirmek için denemek gerekir C-C tarzı ile atmalarını tarzı atmalarını, bu gerçekten sana kalmış. Bir egzersiz gibi, sadece pratik yapmaya ne kullandığını öğrenme öneririm. Ayrıca, arama zahmetine değer ki orada bir mantık hatası bulabilirsin!

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • gsipek

    gsipek

    20 Temmuz 2007
  • K-391

    K-391

    23 EKİM 2012
  • NPR

    NPR

    22 NİSAN 2006