Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Перегрузка присваивания скобок в C++

Автор вопроса: DavidОтветов: 3

Я занимаюсь переносом приложения Objective-C на C++ и решил создать класс, аналогичный NSObject и NSDictionary. Если вы не знакомы с этой системой, NSObject - это объект, который все объекты наследуют в Obj-C, а затем в нем есть механизм подсчета ссылок. Когда ссылок больше нет, объект освобождается.

В моем коде я хотел бы иметь возможность сделать следующее

CMDictionary["Key"] = Object;

Внутренне это хранится как

Map<string, CMObject*> mDictionary

Всякий раз, когда новый объект присваивается объекту, словарь должен сохранить этот объект, вызвав его функцию сохранения, а также вызвав освобождение любого объекта, который этот новый объект мог заменить. Моя проблема связана с тем, что я не могу найти способ запустить код и определить, когда скобки используются в задании, поскольку я не хотел бы, чтобы функция сохранения вызывалась, когда я писал что-то вроде

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

Будет ли в любом случае это делать, или мне нужно будет просто использовать функции getter/setter для изменения моего словаря

  • Не переусердствуйте и не подходите к этому с таким строгим мышлением ООП - замените NSObject на std::shared_ptr<> и NSDictionary на std::unordered_map<>. То, как вы пытаетесь это сделать, было бы в лучшем случае неудобным правильно отслеживать CMObject*, которые вы должны выделить и выделить (как вы, кажется, обнаруживаете, очевидно из ваших ответов на текущие ответы). ildjarn 14.07.2012
  • Я переношу на кросс-платформенную систему, которая распространяется на различные архитектуры (мобильные и настольные). Стандарты C++ 11 пока недоступны и не будут доступны в течение некоторого времени. David 14.07.2012
  • Не уверен, о чем вы думаете, но стандарт C++11 был опубликован с 11 апреля 2011 года... Добро пожаловать в 2012 год? ;-] ildjarn 14.07.2012
  • Они пока недоступны для одновременной кросс-компиляции на Symbian, iOS, Android, Bada, ПК и OSX с использованием платформы Marmalade. Надеюсь, это прояснит ситуацию. David 14.07.2012

c++nsobjectoperator-overloading

Ответы

Ответ 1 · рейтинг 5 · bitmask

Что вы обычно делаете в этой ситуации, так это реализуете:

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

Обратите внимание, что я написал Object& вместо Object. В любом случае вы можете создать экземпляр нового объекта и передать его, полагаясь на надлежащую реализацию Object& Object::operator=(Object const&), которая затем выполнит назначение после возврата вашей Map::operator[] функции (не волнуйтесь, компилятор оптимизирует его в большинстве случаев).

Ответ 2 · рейтинг 1 · retrohacker

Вы должны перегрузить operator[], чтобы принять строку.

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

Ответ 3 · рейтинг 1 · sny

Подумайте о том, чтобы написать новый класс, похожий на shared_ptr<CMObject*>, и выполнить сохранение/освобождение внутри этого объекта.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы