C ++继承/模板问题

时间:2010-07-12 15:35:47

标签: c++ inheritance templates oop

我有两个类,点和像素:

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;
}

现在这是我的问题。我想创建一个容器类(让我们称之为coll),它有一个点或像素的私有向量。如果coll的实例包含像素,我希望它有一个方法toArray(),它将像素向量转换为表示向量内容的T数组。

我将继承这样做:即,我可以创建一个包含点向量的基类coll和包含额外方法的派生类,但是我似乎遇到了问题,因为像素是一个类模板。

有人有建议吗?我可以通过使coll成为类模板来实现这一点吗?

3 个答案:

答案 0 :(得分:3)

问题:你是说私人载体同时包含点和像素,还是只包含其中一个?

问题:如果只是其中一个,您是否想在同一个私有向量中混合使用不同模板参数的像素?

假设它只是私有向量中的Point或Pixel,并且私有向量中的Pixels都具有相同的模板参数,您可以这样做:

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();

    ...

};

答案 1 :(得分:1)

如果您想检查point对象是否也是pixel<T>的类型,那么您只需查看dynamic_cast是否返回NULL。为了做到这一点,point将需要是多态的,所以添加一个虚拟析构函数。

以下是一个例子:

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>.";
}

输出如下:

  

y是一个像素&lt; int&gt;。

您可以在coll课程中使用此代码来检查vector<point *>的每个元素是点还是像素。但是为了做到这一点,你需要知道存储像素的哪个特化(即它是pixel<int>还是pixel<float>?)

coll替换为类模板可能更简单。

答案 2 :(得分:1)

如果collectionpointpixel视为大致相同且仅包含其中一个,则将其设为模板类是有意义的。
然而,关于to_array,使它成为自由函数可能更简单:

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

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

请注意,您必须提供一个公共接口,以便对数据进行读取访问,或者至少有选择地授予to_array()访问权限。