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*他のオブジェクトを内部に保持できるラッパークラスを作成するか、同じ基本クラスからすべての「対象オブジェクトコンテンツ」を派生させます。どちらを好むかはあなた次第です。

私が提案する理由は、データを使用するときは、データを識別できるようにする必要があるためです。そのための関連するインターフェイスを提供するオブジェクトタイプを用意することで、自分自身を助けないように思われます。

言い換えれば、何かを保存する場合は、それが何であるかがわかるように「ラベルを付ける」必要があります。ガレージ、ロフト、または当面は必要ないが将来のために保管したいものを保管する場所で行うのと同じように。たとえば、「古い靴」または「冬服」、「ベビー服」、「本」などのボックスがあります[あなたが私のようで、似たようなボックスがたくさんある場合は、何がわからないのですか?その1つ-しかし、それは私のストレージがソフトウェアとして行われていないためです]。

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