SORU
9 Ocak 2013, ÇARŞAMBA


Nasıl C aynı sınıf için farklı türlerini tanımlamak için

Aynı uygulama paylaşım ama hala C farklı türde çeşitli türleri istiyorum .

Basit bir örnekle sorumu göstermek için, Elma, Portakal ve Muz için bir sınıf için, aynı işlemler ve aynı uygulamaya sahip olmak istiyorum. Onları tür güvenliği için teşekkürler hataları önlemek istiyorum çünkü farklı olsun istiyorum.

class Apple {
     int p;
public:
     Apple (int p) : p(p) {}
     int price () const {return p;}
}

class Banana {
     int p;
public:
     Banana (int p) : p(p) {}
     int price () const {return p;}
}

class Orange ...

Kod çoğaltmak için değil, bir temel sınıf Meyve kullanabilirim ve miras gibi görünüyor:

class Fruit {
     int p;
public:
     Fruit (int p) : p(p) {}
     int price () const {return p;}
}

class Apple: public Fruit {};
class Banana: public Fruit {};
class Orange: public Fruit {};

Ama sonra, kurucular kalıtsal değildir ve onları yeniden yazmak zorunda kalıyorum.

Beni kolayca farklı türleri ile aynı sınıfta olmasına izin veren bir mekanizma (typedefs, şablonlar, miras...) var mı?

CEVAP
9 Ocak 2013, ÇARŞAMBA


Ortak bir teknik şablon argümanı sadece bir eşsiz belirteç olarak hizmet eden bir sınıf şablonu için (“”) etiketi için benzersiz bir tür yapmak:

template <typename Tag>
class Fruit {
    int p;
public:
    Fruit(int p) : p(p) { }
    int price() const { return p; }
};

using Apple = Fruit<struct AppleTag>;
using Banana = Fruit<struct BananaTag>;

Etiket sınıfları bile tanımlanmış olması gerekmez, yeter unutmayınilanbenzersiz bir ad yazın. Bu etiket değil aslında, çünkü çalışırkullanılırherhangi bir şablon. Ve tür adı bildirebilirsiniziçindeşablon bağımsız değişken listesi (@çaktırma Xeo).

using sözdizimi C 11. Eğer C ile sıkışmış iseniz 03, bunun yerine yaz:

typedef Fruit<struct AppleTag> Apple;

Eğer sık işlevselliği kadar bir sürü kod alırsa bu ne yazık ki son yürütülebilir yinelenen kod bir sürü tanıttı. Bu işlevselliği uygulama ortak bir temel sınıf olması, ve sonra türeyen bir uzmanlık aslında örneğini) sahibi tarafından önlenebilir.

Ne yazık ki, bu sadece büyük sınıflar için mantıklı böylece yeniden hayata küçük bir havai ekleyen olmayan kalıt tüm üyeler (kurucular, ödev ...) kendisi için gerektirir. Burada örnek yukarıda: uygulanır

// Actual `Fruit` class remains unchanged, except for template declaration
template <typename Tag, typename = Tag>
class Fruit { /* unchanged */ };

template <typename T>
class Fruit<T, T> : public Fruit<T, void> {
public:
    // Should work but doesn’t on my compiler:
    //using Fruit<T, void>::Fruit;
    Fruit(int p) : Fruit<T, void>(p) { }
};

using Apple = Fruit<struct AppleTag>;
using Banana = Fruit<struct BananaTag>;

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Air_Fooj

    Air_Fooj

    24 NİSAN 2009
  • Strata1000

    Strata1000

    28 EYLÜL 2009
  • Tahir Jahi

    Tahir Jahi

    6 Mart 2006