4

私はObjective-CアプリケーションをC++に移植している最中であり、NSObjectやNSDictionaryに似たクラスを作成することにしました。このシステムに慣れていない場合、NSObjectは、すべてのオブジェクトがObj-Cでフォームを継承するオブジェクトであり、その中に参照カウントメカニズムがあります。参照がなくなると、オブジェクトはそれ自体を解放します。

私のコードでは、次のことができるようにしたいと思います

CMDictionary["Key"] = Object;

内部的には、これは次のように保存されます

Map<string, CMObject*> mDictionary

新しいオブジェクトがオブジェクトに割り当てられるたびに、ディクショナリは、retain関数を呼び出し、この新しいオブジェクトが置き換えられた可能性のあるオブジェクトに対してreleaseを呼び出すことにより、このオブジェクトを保持する必要があります。私の問題は、コードを実行して、割り当てで角かっこがいつ使用されているかを判断できないという事実に起因しています。

CMDicionary["key"]->StringValue();

とにかくこれを行うためにそこにありますか、それとも辞書を変更するためにゲッター/セッター関数を使用する必要がありますか?

4

3 に答える 3

5

この状況で通常行うことは、以下を実装することです。

Object const& Map::operator[](string) const;
Object& Map::operator[](string);

Object&の代わりに書いたことに注意してくださいObject。いずれにせよ、新しいオブジェクトをインスタンス化して配布することができます。実装するプロパティに依存して、関数が戻った後Object& Object::operator=(Object const&)に割り当てを実行します(ほとんどの場合、コンパイラが最適化します)。Map::operator[]

于 2012-07-14T00:23:12.450 に答える
1

operator[]文字列を受け入れるには、をオーバーロードする必要があります。

http://courses.cms.caltech.edu/cs11/material/cpp/donnie/cpp-ops.html

于 2012-07-14T00:14:34.953 に答える
1

に似た新しいクラスを作成しshared_ptr<CMObject*>、そのオブジェクト内で保持/解放を行うことを検討してください。

于 2012-07-14T00:23:55.290 に答える