1

1 つのメソッドを実装するスーパークラスを C++ で実装しようとしています。

-void setValueForKey(void *value, string key);

このメソッドで行う必要があるのは、特定のキーに関連付けられたプロパティの値を新しい値に設定することだけです。これは、イントロスペクション メカニズムを実装する言語では簡単です。私の知る限り、C++ はそうではありません。

これを達成するために、別の方法を作成しました。

void registerKeyForProperty(void *propertyPtr, string key);

このメソッドが行うのは、指定されたキーに関連付けられたプロパティへのポインタを格納し、内部マップすることだけです。したがって、すべてのサブクラスは、宣言するすべてのプロパティに対してこれを呼び出し、プロパティの値を設定する方法を使用する必要はありません。セッター。

この 2 番目の関数には、次の実装があります。

void registerKeyForProperty(void *propertyPtr, string key){

   _keysDictionary->insert(pair<string,void*>(key,property));
}

_keysDictionary は stl マップです。

最初のものには、次の実装があります。

void ConstructableObject::setValueForKey(void* value, string key) {

    map<string,void *>::iterator it=_keysDictionary->find(key);

    if(it==_keysDictionary->end()){return;}//just return if there is nothing for that key

    void *property=it->second;

    (*property)=value;
}

問題は、最後の行が正当な C++ ではないことです。もちろん、その void* を参照することはできません。

私の質問は次のとおりです。

目的の機能を実装する他の方法はありますか? 私がやっているようにこれを行う「合法的な」方法はありますか?(何にキャストすればよいかわからないため、単純に reinterpret_cast を使用することはできません...)

理由:

いくつかのオブジェクトに関する情報を含む xml ファイルを解析する必要があります。ここでは TinyXML を使用するので、オブジェクトの属性名とその値を取得します。それが私がそれを使いたい方法です:

MyClass obj();//the constructor would call setValueForKey(...,...) for every property so all are now registered
for every attribute{
    obj.setValueForKey(attribute.value,attribute.name);
}

//all properties should be set now
4

3 に答える 3

1

キーが存在する場合は、単純に実行してみませんか

_keysDictionary[key] = value;

または、イテレータを使用する場合

it->second = value;
于 2013-09-14T09:04:37.013 に答える