2010-07-12 10 views
5

/şablonu:C++ devralma iki sınıf, noktası ve pikseli bulunan soru

class point { 
    public: 
     point(int x, int y) : x(x), y(y) { }; 
    private: 
     int x, y; 
} 

template <class T> 
class pixel : public point { 
    public: 
     pixel(int x, int y, T val) : point(x, y), val(val) { }; 
    private: 
     T val; 
} 

Şimdi burada benim sorunum. Özel bir nokta veya piksel vektörüne sahip bir konteyner sınıfı (onu arayalım diyelim) yapmak istiyorum. Bir koleksiyon örneği piksel içeriyorsa, onun piksel vektörünü vektörün içeriğini temsil eden bir T dizisine dönüştüren toArray() yöntemine sahip olmasını isterim.

Bunu kalıtımla yapacağım: yani, bir nokta vektörünü ve ekstra yöntemi içeren türetilmiş bir sınıf içeren bir temel sınıf koleksiyonunu yapabilirdim, ancak piksel bir yana sınıf şablonu

Herhangi bir öneri var mı? Bunu bir şekilde sınıf şablonu hazırlayarak yapabilir miyim?

+0

Bence "coll" da bir şablon sınıfı olmalı. Daha sonra, "coll" kelimesini kısmen ve pikseller için özelleştirebilirsiniz. – Philipp

+0

Piksel bir takım koordinatlar (yani 'nokta') 'dır veya koordinatları var mı (yani bir nokta örneği içerir)? – Patrick

+0

Noktadan miras alır. – amc

cevap

3

Soru: Özel vektörün hem Puan hem de Pikselleri aynı anda veya sadece birini veya diğerini içermesi anlamına mı geliyor?

Soru: Yalnızca bir başkası aynı pikselde farklı şablon parametrelerini aynı özel vektörle karıştırmak mı istiyorsunuz?

template < class T > class CollectionBase 
{ 
    //common interface here 
    protected: 
    std::vector<T> coll_vec; 
}; 

class PointCollection : public CollectionBase<Point> 
{ 
    public: 
    ... 
}; 

template< class T> PixelCollection : public CollectionBase<Pixel<T> > 
{ 
    public: 
    Pixel<T>* toArray(); 

    ... 

}; 
+0

Yanıt: sadece bir veya diğeri. Yanıt: Sadece aynı şablon parametresine sahip pikseller. Bu çözüm oldukça iyi görünüyor, ancak koleksiyonlarımın aynı işlevselliği çok olacak: Bu, CollectionBase'in kapsayıcılara erişimi olmayacağından, aynı kodun çoğaltılmasını gerektirmiyor mu? Kod çoğaltmasını önlemek için – amc

+0

@amc güncellendi. Bu, PointCollection'ı biraz gereksiz kılar, ancak bu, PixelCollection'dan PointCollection'a kadar olan çoğu cast'ı engeller ve bunun tersi de geçerlidir. Birbirlerinin aralarında paylaşılmasına izin vermek istiyorsanız, o zaman CollectionBase ve PointCollection'ı tek bir sınıfa entegre edebilirsiniz. – diverscuba23

+0

AWESOME, tam istediğim bu. Bir şablon sınıfının alt sınıfını bulabileceğinizi anlayamadım. Teşekkürler! – amc

1

İsterseniz için: sadece noktası veya Piksel özel vektör içinde, ve özel vektöründe Piksel hepsi aynı şablon parametresi olduğuna göre, böyle bir şey yapabileceğini olduğunu varsayarsak

point nesnesinin de pixel<T> türünde olup olmadığını kontrol edin, ardından dynamic_cast'un NULL değerini döndürüp döndürmediğini görebilirsiniz. Bunu yapmak için, point'un polimorfik olması gerekir, bu yüzden ona bir sanal yıkıcı ekleyin.

Burada bir örnek:

point x(0, 0); 
pixel<int> y(0, 0, 0); 
point *pX = &x; 
point *pY = &y; 
if(dynamic_cast<pixel<int> *> (pX) != NULL) { 
    std::cout << "x is a pixel<int>."; 
} 
if(dynamic_cast<pixel<int> *> (pY) != NULL) { 
    std::cout << "y is a pixel<int>."; 
} 

aşağıdaki şekilde verilir:

y>, bir piksel < int.

Bir vector<point *> her eleman bir nokta veya bir piksel olup olmadığını kontrol etmek için coll sınıfında bu kodu kullanabilirsiniz. Ama bunu yapmak için, size

Bu basit olabilecek yerine coll bir sınıf şablonu yapmak için (yani bir pixel<int> veya pixel<float>? Öyle) depolanmış olan pikselin hangi uzmanlık bilmesi gerekir.

1

point davranır collection Eğer ler ve pixel çoğunlukla aynı s ve sadece bir ya da diğer, onu bir şablon sınıfı yapmak için mantıklı içerir. Eğer ki verilere salt erişimi için ortak bir arayüz sağlamak veya en azından seçici to_array() erişim vermek zorunda kalacak

template<class T> struct collection { 
    std::vector<point<T> > data_; 
    // ... 
}; 

template<class T> 
void to_array(const collection<point<T> >& in, point<T>* out) { 
    // ... 
} 

Not:
ancak to_array ilgili olarak, o yerine özgür bir işlev yapmak basit olabilir .