SORU
19 EKİM 2008, Pazar


İç içe geçmiş C sınıfı ve numaralandırma kullanarak artılarını ve eksilerini?

İç içe geçmiş ortak C sınıfları ve numaralandırmaları kullanmanın artıları ve eksileri nelerdir? Örneğin, bir sınıf printer adı verilen ve bu sınıf da çıkış tepsileri hakkında bilgi saklar sanırım, olabilir:

class printer
{
public:
    std::string name_;

    enum TYPE
    {
        TYPE_LOCAL,
        TYPE_NETWORK,
    };

    class output_tray
    {
        ...
    };
    ...
};

printer prn;
printer::TYPE type;
printer::output_tray tray;

Alternatif olarak:

class printer
{
public:
    std::string name_;
    ...
};

enum PRINTER_TYPE
{
    PRINTER_TYPE_LOCAL,
    PRINTER_TYPE_NETWORK,
};

class output_tray
{
    ...
};

printer prn;
PRINTER_TYPE type;
output_tray tray;

Yuvalama özel çeteleler faydaları/sınıflar görebiliyorum, ama ortak olanlara gelince, ofis tarzı bir seçenek daha fazla gibi görünüyor ayrılır.

Hangisi ve neden tercih ediyorsunuz?

CEVAP
19 EKİM 2008, Pazar


Sınıflar iç içe

Sınıflar genelde kusurları dikkate sınıflar içinde yuvalanmış (saf antipatterns) için bazı yan etkileri vardır.

Hadi aşağıdaki kodu düşünün :

class A
{
   public :
      class B { /* etc. */ } ;

   // etc.
} ;

Hatta:

class A
{
   public :
      class B ;

   // etc.
} ;

class A::B
{
   public :

   // etc.
} ;

Yani:

  • Erişim Privilegied:::Bir B tüm üyeleri (metotlar, değişkenler, semboller, vb.), erişim privilegied vardır saklama zayıflatır
  • Bir kapsam sembol araması için adayiçinde B kod göreceksiniztümkod karıştırmayın olabilir hangi sembol araması için olası adaylar olarak Bir sembol
  • ileriye dönük beyanıİleri-ilan yolu yok::B . tam bir beyan vermeden
  • ASPİmkansız bir sınıf eklemek için::C sürece Bir sahibi vardır
  • Kod ayrıntı:sınıflara koyarak sınıflar sadece başlıklarını daha büyük yapar. Hala çoklu bildirimleri, bu ayrı, ama ad-takma ad, ithalat veya usings kullanmanın yolu yok.

Gibi bir sonuç, tabii özel durumlar (örneğin iç içe geçmiş sınıfı samimi bir bölümü iç içe geçmiş sınıf... Ve o zaman bile...), gördüğüm hiçbir nokta, iç içe geçmiş sınıflar normal kod olarak kusurları outweights büyüklükleri ile algılanan avantajları.

Ayrıca, acemice C ad kullanmadan namespacing benzetmek gibi kokuyor.

Bu kod yalıtmak ve özel bir pro-yan, onu kullanılamaz hale ama ""... sınıf

İç içe çeteleler

Artıları: Her Şey.

Con: Hiçbir Şey.

Aslında numaralama öğeleri genel kapsam kirletmez olacaktır:

// collision
enum Value { empty = 7, undefined, defined } ;
enum Glass { empty = 42, half, full } ;

// empty is from Value or Glass?

Farklı bir ad/bir sınıfta her isimli koyarak Ony bu çarpışmadan kaçınmak için sağlayacaktır:

namespace Value { enum type { empty = 7, undefined, defined } ; }
namespace Glass { enum type { empty = 42, half, full } ; }

// Value::type e = Value::empty ;
// Glass::type f = Glass::empty ;

C 0x sınıf numaralama tanımlanan unutmayın:

enum class Value { empty, undefined, defined } ;
enum class Glass { empty, half, full } ;

// Value e = Value::empty ;
// Glass f = Glass::empty ;

bu tür problemler için tam olarak.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • edwin maldonado

    edwin maldon

    28 Mart 2009
  • Elefant Traks

    Elefant Trak

    5 HAZİRAN 2007
  • Wii Minute Radio

    Wii Minute R

    31 Mayıs 2008