0

在我正在开发的一个库中,我有一个类,我想要一个存储任何类型数据的哈希。这是因为使用此库的算法可能希望将特定数据存储在该类的对象中。

该类称为“ObjectOfInterest”,其中我使用 QT 定义了哈希:

QHash<QString, void*> properties;

然后我实现了这个函数来存储信息:

bool ObjectOfInterest::hasProperty(QString prop) const
{
    return properties.contains(prop);
}

template <class T> const T& ObjectOfInterest::getProperty(const QString prop) const
{
    return *(T *)properties.value(prop);
}

template <class T> void ObjectOfInterest::setProperty(const QString prop, T value)
{
    if (hasProperty(prop)) deletePropertyValue<T>(prop);
    properties.insert(prop, new T(value));
}

//private
template <class T> void ObjectOfInterest::deletePropertyValue(const QString prop)
{
    delete (T *)properties.value(prop);
}

现在的问题是,当删除“ObjectOfInterest”的对象时,如何删除存储在属性哈希中的所有值?现在我有

ObjectOfInterest::~ObjectOfInterest()
{
    //delete other stuff...

    QHash<QString, void*>::iterator i;
    for (i = properties.begin(); i != properties.end(); ++i)
    {
        delete i.value();
    }
}

但这不是解决方案,因为我没有调用析构函数。任何想法如何做到这一点?

谢谢!

4

2 回答 2

1

因此,void*我不会使用 a ,而是创建一个包装类,它可以在其中包含一些其他对象,或者从同一个基类中获取所有“感兴趣的对象内容”。你更喜欢哪一个将取决于你。

我建议这样做的原因是,当您开始使用数据时,您会希望它是可识别的,并且通过提供相关接口来执行此操作的对象类型来帮助自己似乎很愚蠢。

换句话说,如果你存储一些东西,你想给它“贴上标签”,这样你就知道它是什么了。就像您在车库、阁楼或任何您存放暂时不需要但想保留以备将来使用的东西的地方一样。例如,你有一个盒子,上面写着“旧鞋”或“冬装”、“婴儿服”、“书”等[除非你像我一样,而且你只有一堆类似的盒子,不知道是什么在哪一个 - 但那是因为我的存储不是作为软件完成的]。

于 2013-01-28T10:40:40.060 回答
0

最后解决方案是使用 boost::any

//ObjectOfInterest.h
public:
    ...
    bool    hasProperty(const string & prop) const;
    void    emplaceProperty(const string & prop, boost::any value);
    void    setProperty(const string & prop, boost::any value);
    template <class T> const T property(const string & prop) const
    {
    return any_cast<T>(properties.at(prop));
    }
...
private:
    ...
    boost::unordered::unordered_map<string, boost::any> properties;

//ObjectOfInterest.cpp
...
bool ObjectOfInterest::hasProperty(const string & prop) const
{
    return properties.find(prop)!=properties.end();
}

void ObjectOfInterest::emplaceProperty(const string & prop, any value)
{
    properties.emplace(prop, value);
}

void ObjectOfInterest::setProperty(const string & prop, any value)
{
    properties[prop] = value;
}
于 2013-01-29T10:30:44.040 回答