在C ++中重载括号赋值

时间:2012-07-14 00:09:26

标签: c++ operator-overloading nsobject

我正在将Objective-C应用程序移植到C ++,我决定创建一个类似于NSObject和NSDictionary的类。如果您不熟悉这个系统,NSObject是一个对象,所有对象都在Obj-C中继承,然后在其中有一个引用计数机制。当没有更多引用时,该对象将自行释放。

在我的代码中,我希望能够执行以下操作

CMDictionary["Key"] = Object;

在内部,它存储为

Map<string, CMObject*> mDictionary

每当将一个新对象分配给该对象时,该字典必须通过调用其retain函数以及在该新对象可能已替换的任何对象上调用release来保留该对象。我的问题源于这样一个事实,即无论如何我都找不到运行代码并确定何时在赋值中使用括号,因为我不希望在写出类似

之类的东西时调用retain函数
CMDicionary["key"]->StringValue();

无论如何都会这样做,或者我是否需要使用getter / setter函数来修改我的字典

3 个答案:

答案 0 :(得分:5)

在这种情况下,您通常要执行以下操作:

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

请注意,我写了Object&而不是Object。您无论如何都可以实例化一个新的对象并将其交付出来,依靠适当的Object& Object::operator=(Object const&)来执行,然后执行分配, Map::operator[]函数返回(别担心,编译器会在大多数情况下对其进行优化)。

答案 1 :(得分:1)

您应该重载operator[]以接受字符串。

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

答案 2 :(得分:1)

考虑编写一个类似于shared_ptr<CMObject*>的新类,并在该对象内部进行保留/释放。