我正在家里用Qt学习C ++。我正在使用该项目来学习设计实践。最近我遇到了一个需要让我进入模板。
我为Qt的QPixmap
图片格式创建了一个openGL图片查看器。
我想在这个查看器中添加一个图片格式转换器。
目前我需要将openCV的cv::Mat
转换为QPixmap
。
将来我可能遇到其他格式(所以其他C ++类型)。所以我想到了模板。这是我的出发点:
template <class T>
class ToQPixmapConverter : public QObject
{
public:
ToQPixmapConverter(QObject *parent = 0) : QObject(parent) {
setRawPic(new T());
}
~ToQPixmapConverter(){delete rawPic;}
T *getRawPic() const {return rawPic;}
void setRawPic(T *pRawPic) {rawPic = pRawPic;}
// TO BE SPECIALIZED/OVERLOADED or something
QPixmap *convert(T &pRawPic) {return nullptr;}
QPixmap *convertFromPath(cv::String const path) {return nullptr;}
protected:
T* rawPic;
QPixmap localPixMap;
};
我希望保留所有成员和大多数方法,因此我只需为所有不同格式实施convert
和convertFromPath
。
部分模板专业化。 我花了很长时间努力尝试不允许的东西,最后我找到了这个解决方案:Understanding (simple?) C++ Partial Template Specialization
但在第二个答案中:
明确专门化的功能永远不会(几乎从不?)正确 办法。在我作为程序员的工作中,我从来没有明确专门的 功能模板。重载和部分排序是优越的。
继承课堂模板。 我认为这就是我的需要,但我无法实现:
class CvMatToQPixmapConverter : public ToQPixmapConverter<cv::Mat>{};
QPixmap * CvMatToQPixmapConverter::convert(cv::Mat &pRawPic)
{
// Some stuff
}
QPixmap * CvMatToQPixmapConverter::convertFromPath(cv::String const path)
{
// Some stuff
}
使用此代码我得到:
error: no 'QPixmap* CvMatToQPixmapConverter::convert(cv::Mat&)' member function declared in class 'CvMatToQPixmapConverter'
QPixmap * CvMatToQPixmapConverter::convert(cv::Mat &pRawPic)
^
所以我之前尝试定义ToQPixmapConverter<cv::Mat>
:
template <>
class ToQPixmapConverter<cv::Mat>;
但我明白了:
error: invalid use of incomplete type 'class ToQPixmapConverter<cv::Mat>'
class CvMatToQPixmapConverter : public ToQPixmapConverter<cv::Mat>{};
^
我希望我提供足够的背景,以便有人可以帮助我。 基本上,我的问题是。
感谢您的帮助! :)
PS:我最初的想法是将策略模式与类模板结合起来......但我失败了。它会在这里工作吗?
答案 0 :(得分:2)
我认为抽象基类和必要的具体子类将是一个更好的设计,而不是类模板。
class ToQPixmapConverter : public QObject
{
public:
ToQPixmapConverter(QObject *parent = 0) : QObject(parent) {}
~ToQPixmapConverter(){}
// TO BE OVERLOADED
virtual QPixmap *convert() {return nullptr;}
virtual QPixmap *convertFromPath(cv::String const path) {return nullptr;}
protected:
}
class FromCVMatToQPixmapConverter : public ToQPixmapConverter
{
public:
FromCVMatToQPixmapConverter(cv::Mat* rawPicIn, QObject *parent = 0) : ToQPixmapConverter(parent), rawPic(rawPicIn) {}
~FromCVMatToQPixmapConverter(){delete rawPic;}
virtual QPixmap *convert() { /* Add code to do it*/ }
virtual QPixmap *convertFromPath(cv::String const path) { /* Add code to do it*/ }
private:
cv::Mat* rawPic;
};