0

我有一个(部分实现的)类层次结构,其中

template<typename T> {
    class data { 
        data ( string s ) {}; // loads from file
        ...
    }
    class image: public data <T> { 
        image ( string s ) {}; // loads from file
        ...
    }
    class jpgimage : public image<T> {
        jpgimage ( string s ) {}; // loads from file 
        ...
    }
    // other image types
}

现在在我的其余代码中,我希望能够从某物是 jpeg 图像还是图像中抽象出来,所以我想使用data. 但同时我想将特定于 jpeg 图像的命令传递给这些函数。

因此,如果我调用data<int> img("lena.jpg");的结果是图像,甚至是 jpeg 图像,我希望数据构造函数调用图像构造函数,而图像构造函数又调用 jpgimage 构造函数。

我无法让它工作,人们警告切片、虚拟构造函数等。但这是一种奇怪的设置方式吗?

4

3 回答 3

1

继承是用于是一种关系。所以, animage<T> 是 a data<T>,但不是相反!image<T>为对象调用特定的方法是没有意义的data<T>,毕竟它可能不是image<T>. 您想要这样做的事实表明您的代码设计存在缺陷。重新考虑您的代码设计。

于 2013-10-15T21:25:25.827 回答
1

要实现这一点,您需要数据是实现的所有者,而不是基类:

template<typename T> 
class base_data {
    base_data ( string s ) {} // loads from file
    // ...  
};

template<typename T> 
class image: public base_data <T> { 
    image ( string s ) {} // loads from file
    ... 
};

template<typename T> 
class jpgimage : public image<T> {
    jpgimage ( string s ) {} // loads from file 
    // ...
    // other image types
};

template<typename T> 
class data {
    data ( string s ) {
        if(is_jpeg( s )) impl = new jpeg_data<T>( s );
        // ...
    } // loads from file
    // ...
    private:
        base_data<T> *impl;
};

现在在构造函数中,您可以创建正确的实现类型等等。

于 2013-10-15T21:30:16.237 回答
0

我会说这是一个糟糕的设计。如果您确定自己知道,您不需要使用泛型data类来猜测您是否使用图像。在需要的地方使用imageorjpgimage类,并使其他一切都使用泛型data类。

于 2013-10-15T21:30:05.517 回答