I'd like to store in QHash
elements that inherits from one class. So I've got:
class ImageInterface
{
public:
ImageInterface();
ImageInterface(const QString& path);
virtual QString getName() const = 0;
};
And implementation:
class Image : public ImageInterface
{
public:
Image();
Image(const QString& path);
QString getName() const { return name; }
private:
QString name;
};
Then I want to use it in QHash
:
QHash<QString, ImageInterface> *imageMap;
imageMap = new QHash<QString, ImageInterface>();
ImageInterface *im = new Image(var);
imageMap->insert(im->getName(), *im);
imageMap->take(name);
There are errors.
../EmulatorKamery/mainwindow.cpp:59:28: error: cannot allocate an object of abstract type ‘ImageInterface’
../EmulatorKamery/imageinterface.h:8:11: note: because the following virtual functions are pure within ‘ImageInterface’:
../EmulatorKamery/imageinterface.h:13:25: note: virtual QString ImageInterface::getName() const
In file included from /usr/include/qt4/QtCore/qvariant.h:50:0,
from /usr/include/qt4/QtCore/qabstractitemmodel.h:45,
from /usr/include/qt4/QtGui/qabstractitemview.h:46,
from /usr/include/qt4/QtGui/qlistview.h:45,
from /usr/include/qt4/QtGui/qlistwidget.h:45,
from /usr/include/qt4/QtGui/QListWidget:1,
from ../EmulatorKamery/mainwindow.h:5,
from ../EmulatorKamery/mainwindow.cpp:1:
/usr/include/qt4/QtCore/qhash.h: At global scope:
/usr/include/qt4/QtCore/qhash.h: In instantiation of ‘QHashNode<QString, ImageInterface>’:
/usr/include/qt4/QtCore/qhash.h:765:9: instantiated from ‘QHash<K, V>::iterator QHash<K, V>::insert(const Key&, const T&) [with Key = QString, T = ImageInterface]’
../EmulatorKamery/mainwindow.cpp:46:48: instantiated from here
/usr/include/qt4/QtCore/qhash.h:221:7: error: cannot declare field ‘QHashNode<QString, ImageInterface>::value’ to be of abstract type ‘ImageInterface’
../EmulatorKamery/imageinterface.h:8:11: note: since type ‘ImageInterface’ has pure virtual functions
/usr/include/qt4/QtCore/qhash.h: In member function ‘T QHash<K, V>::take(const Key&) [with Key = QString, T = ImageInterface]’:
../EmulatorKamery/mainwindow.cpp:59:28: instantiated from here
/usr/include/qt4/QtCore/qhash.h:805:24: error: invalid abstract return type for member function ‘T QHash<K, V>::take(const Key&) [with Key = QString, T = ImageInterface]’
../EmulatorKamery/imageinterface.h:8:11: note: since type ‘ImageInterface’ has pure virtual functions
开发者_JAVA技巧../EmulatorKamery/mainwindow.cpp:59:28: instantiated from here
/usr/include/qt4/QtCore/qhash.h:808:18: error: cannot allocate an object of abstract type ‘ImageInterface’
../EmulatorKamery/imageinterface.h:8:11: note: since type ‘ImageInterface’ has pure virtual functions
/usr/include/qt4/QtCore/qhash.h:813:24: error: cannot allocate an object of abstract type ‘ImageInterface’
../EmulatorKamery/imageinterface.h:8:11: note: since type ‘ImageInterface’ has pure virtual functions
/usr/include/qt4/QtCore/qhash.h:813:11: error: cannot declare variable ‘t’ to be of abstract type ‘ImageInterface’
../EmulatorKamery/imageinterface.h:8:11: note: since type ‘ImageInterface’ has pure virtual functions
../EmulatorKamery/mainwindow.cpp:59:28: instantiated from here
/usr/include/qt4/QtCore/qhash.h:819:16: error: cannot allocate an object of abstract type ‘ImageInterface’
../EmulatorKamery/imageinterface.h:8:11: note: since type ‘ImageInterface’ has pure virtual functions
/usr/include/qt4/QtCore/qhash.h:821:14: error: cannot allocate an object of abstract type ‘ImageInterface’
../EmulatorKamery/imageinterface.h:8:11: note: since type ‘ImageInterface’ has pure virtual functions
/usr/include/qt4/QtCore/qhash.h:822:1: warning: control reaches end of non-void function [-Wreturn-type]
How should I implemented something like this?
You have to store pointers to your abstract type. Otherwise it's going to try to instantiate instances of that class, which it can't since it's abstract.
QHash<QString, ImageInterface*> *imageMap;
You have to store pointers (or better smart pointers like std::shared_ptr or QSharedPointer) in your hash container.
精彩评论