【发布时间】:2014-11-23 15:39:25
【问题描述】:
我有一个AbstractIndex 定义其Items 的接口以及排序和查询算法。此外,我还有几个具体的索引,例如FileIndex 下面的示例。现在我想序列化 indizes。我猜serializeIndex() 有效,但我无法测试它。在FileIndex::buildIndex() 中,AbstractIndexProvider::Item 的operator>> 被调用。我试图向下转换_index,但出现奇怪的编译时错误。使用 boost 我可以轻松声明类型,但我想删除 boost 依赖项。 那么我该怎么做才能让 Qt 在 FileIndex::buildIndex() 中实例化正确的类?
class AbstractIndex
{
public:
class Item;
void query(const QString &req, QVector<Item*> *res);
protected:
virtual void buildIndex() = 0;
virtual void serializeIndex() const = 0;
QVector<Item*> _index;
};
class AbstractIndexProvider::Item
{
public:
QString _name;
// Several pure virtual functions...
// Serialization
friend QDataStream &operator<<(QDataStream &out, AbstractIndexProvider::Item const * const item);
friend QDataStream &operator>>(QDataStream &in, AbstractIndexProvider::Item *item);
};
/**************************************************************************/
class FileIndex : public AbstractIndexProvider
{
public:
class Item;
protected:
void buildIndex() override;
void serializeIndex() const override;
};
class FileIndex::Item : public AbstractIndexProvider::Item
{
friend class FileIndex;
protected:
QString _path;
friend QDataStream &operator<<(QDataStream &out, const FileIndex::Item &item);
friend QDataStream &operator>>(QDataStream &in, FileIndex::Item &item);
};
/**************************************************************************/
void FileIndex::serializeIndex() const
{
QFile file(_indexFile);
if (file.open(QIODevice::ReadWrite| QIODevice::Text))
{
QDataStream stream( &file );
stream << _index;
return;
}
}
/**************************************************************************/
void FileIndex::buildIndex()
{
QFile file(_indexFile);
if (file.open(QIODevice::ReadOnly | QIODevice::Text))
{
QDataStream stream( &file );
stream >> _index; // WHAT TO DO HERE?
return;
}
}
【问题讨论】:
标签: c++ qt inheritance serialization polymorphism