C++ автоматическая функция вызова после заменяет переменную

Существует ли функция в C++, что, когда переменная была заменена, она автоматически вызывает функцию?

8
задан stefan 1 July 2010 в 15:17
поделиться

7 ответов

Если переменная имеет тип класса, вы можете перегрузить ее функцию operator = () . Вы не можете этого сделать, если переменная является примитивным типом.

0
ответ дан 5 December 2019 в 05:55
поделиться

Вы можете инкапсулировать эту переменную и иметь слушателей, которые уведомляются при изменении значения. Для этого я бы выбрал boost :: signal или boost :: signal2:

http://www.boost.org/doc/libs/1_43_0/doc/html/signals2.html

и вот некоторая информация на шаблоне наблюдателя: http://en.wikipedia.org/wiki/Observer_pattern

0
ответ дан 5 December 2019 в 05:55
поделиться

Одним словом; нет.

Но что вам нужно сделать, так это обернуть переменную в класс (я не собираюсь предлагать перегрузку оператора) и изменить ее с помощью функции set (...). Затем вы просто вызываете функцию из заданной функции.

9
ответ дан 5 December 2019 в 05:55
поделиться

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

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

3
ответ дан 5 December 2019 в 05:55
поделиться

Есть ли в C ++ функция, которая при изменении переменной автоматически вызывает функцию?

Нет, я не мог подумать об этом. Однако вы можете обернуть доступ к переменной в подходящую оболочку, которая позволит вам подключиться к присваиванию.
Примерно так:

//Beware, brain-compiled code ahead!
template<typename T>
class assignment_hook {
public:
  typedef void (hook_t)(const T& old_value, const T& new_value);

  assignment_hook(T& value, hook_t hook) : ref_(value), hook_(hook)  {}

  T& operator=(const T& rhs)
  {
     hook_(ref_,rhs);
     ref_ = rhs;
  }
private:
  // I'd rather not want to think about copying this
  assignment_hook(const assignment_hook&);
  void operator=(const assignment_hook&);

  T& ref_;
  hook_t hook_;
};

Как отметил Ной в комментарии,

typedef boost::function<void(const T&,const T&)> hook_t;

(или, если он есть в вашем компиляторе, std :: tr1 :: function или std :: function ) значительно улучшил бы это, потому что он позволяет вызывать все виды «совместимых» функций. (Например, он позволяет использовать все виды магии, используя boost / std :: / tr1 :: bind <> для вызова функций-членов и прочего.)

Также обратите внимание, что, как сказал adf88 в своих комментариях , это просто выполняет то, о чем просили (отслеживает доступ для записи в переменную), и ни в коем случае не является полноценной реализацией свойства. Фактически, несмотря на отношение C ++ к реализации как можно большего количества библиотек и как можно меньшего количества на языке, и несмотря на попытки многих людей (некоторые из них довольно умные), никто не нашел способа реализовать свойства на C ++. как библиотека , без поддержки языка.

13
ответ дан 5 December 2019 в 05:55
поделиться

Нет, вы должны инкапсулировать переменную в пару методов get/set.

2
ответ дан 5 December 2019 в 05:55
поделиться

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

Однако лучшим вариантом было бы поместить эту функциональность в метод установки для этой переменной. Это может быть функция слушателя или прямой вызов функции.

1
ответ дан 5 December 2019 в 05:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: