0

I have a (partally implemented) class hierarchy where

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
}

Now in the rest of my code I would like to be able to abstract from whether something is a jpeg image or even an image, so I would like to work with data. But at the same time I would like to pass commands specific to jpeg images to those functions.

So if I call data<int> img("lena.jpg"); which turns out to be an image, even a jpeg image, I would like the data constructor to call the image constructor, which in turn calls the jpgimage constructor.

There is no way I can get it to work, and people warn about slicing, virtual constructors, etc. But is this such a strange way to set it up?

4

3 に答える 3

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 に答える
1

継承は関係のために使用されます。つまり、 はimage<T> ですが、 data<T>その逆ではありません! image<T>オブジェクトに対して固有のメソッドを呼び出すことは意味がdata<T>ありませんimage<T>。それをしたいという事実は、コード設計に欠陥があることを示しています。コードの設計を再考してください。

于 2013-10-15T21:25:25.827 に答える
0

設計が悪いと言えます。画像を操作することが確実にわかっている場合は、画像を操作するかどうかを推測するためだけにジェネリックdataクラスを操作する必要はありません。またはクラスを必要な場所で使用し、他のすべてをジェネリッククラスで機能させます。imagejpgimagedata

于 2013-10-15T21:30:05.517 に答える