C+中的重载括号赋值+; 我正在将Objto-C应用程序移植到C++中,并决定创建一个类似于NSbObjor和NS字典的类。如果您不熟悉该系统,NSObject是所有对象在Obj-C中继承形式的对象,并且其中有一个引用计数机制。当不再有引用时,对象将释放自身

C+中的重载括号赋值+; 我正在将Objto-C应用程序移植到C++中,并决定创建一个类似于NSbObjor和NS字典的类。如果您不熟悉该系统,NSObject是所有对象在Obj-C中继承形式的对象,并且其中有一个引用计数机制。当不再有引用时,对象将释放自身,c++,operator-overloading,nsobject,C++,Operator Overloading,Nsobject,在我的代码中,我希望能够执行以下操作 CMDictionary["Key"] = Object; 在内部,它存储为 Map<string, CMObject*> mDictionary 无论如何,我是否需要使用getter/setter函数来修改我的字典?您应该重载操作符[]以接受字符串 在这种情况下,您通常会执行以下操作: Object const& Map::operator[](string) const; Object& Map::operator[](s

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

CMDictionary["Key"] = Object;
在内部,它存储为

Map<string, CMObject*> mDictionary

无论如何,我是否需要使用getter/setter函数来修改我的字典?您应该重载
操作符[]
以接受字符串


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

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


请注意,我编写了
Object&
而不是
Object
。无论如何,您都可以实例化一个新对象并分发它,这依赖于要实现的适当的
对象&Object::operator=(Object const&)
,然后执行赋值,
您的
映射::operator[]
函数返回后(不要担心,编译器会在大多数情况下对其进行优化).

考虑编写一个类似于
共享\u ptr
的新类,并在该对象内部执行保留/释放操作。

这并不能解决整个问题。阅读我文章的底部。你如何判断你是用它来分配还是阅读?你不想仅仅因为你阅读就双倍保留。哦,我明白了。很抱歉给出了不完整的答案。听起来很棒!我没有意识到这在C++中是合法的。我会检查它,并标记它是正确的答案,如果它工作。我只是想到了一个问题。。。如果我需要释放一个旧对象,我可以通过传递的信息来判断,但是我看不出有任何方法可以保留使用此方法分配的任何新对象。@David:恐怕我不知道你的意思。你能澄清一下吗?所以当我赋值时,我会使用这个伪代码:SetObject(key k,object o){if(isSet(k)Objects[k]->release;InternalDictSet(k,o);o->retain;}当使用括号时,我知道我的对象将被object&Map::operator[](字符串)覆盖;因此,我可以释放旧对象(如果该键在那里的话),但无法保留我可以看到的新对象。我认为这是属于对象类的东西。您的映射应该只关注自身,在该插槽中分配第一个对象,然后只返回对它的引用。不要过度设计,并且不要用如此严格的面向对象的思维方式来处理这个问题——用
std::shared_ptr
替换
NSObject
,用
std::unordered_map
替换
NSDictionary
。按照您尝试的方式,最好是正确地跟踪您必须分配和删除的
CMObject*
(正如您似乎发现的,从您对当前答案的答复中可以明显看出)。我正在移植到一个跨平台系统,该系统分布到各种不同的体系结构(移动和桌面)C++ 11标准尚未提供,而且不会有一段时间。不确定你在想什么,但是C++ 11标准自2011-04-11以来就已经发布了……欢迎到2012???-它们还不能同时使用Symbian,iOS,Android,BADA,PC和OSX使用果酱平台。更好的是,只使用<代码> SyddypTr> /Cord>本身——尝试重新创建它只会在痛苦中结束。不幸的是,我移植到一个跨平台的系统,它部署到各种ARM和X86类型的系统。C++ 11标准还没有对所有这些系统可用,所以我坚持用旧的方式来做它。戴维:旧的。传统的方法是
boost::shared\u ptr
boost::unordered\u map
——仍然不需要在这里重新发明轮子。:-]我们一直在研究如何将boost交叉编译应用到所有这些平台,结果好坏参半。我相信它最终会实现,但希望能更快,而不是更快later@David:FWIW我正在使用的两个库上面提到的只是头,不需要链接,因此不需要交叉编译,只需要交叉编译您自己的应用程序。
Object const& Map::operator[](string) const;
Object& Map::operator[](string);