Страницы

Поиск по вопросам

четверг, 5 декабря 2019 г.

Единожды вызываемая функция

#cpp


Как при создании объекта класса вызвать функцию, которую в дальнейшем нельзя будет
вызывать (ни с помощью данного экземпляра, ни других экземпляров этого класса)?
    


Ответы

Ответ 1



Для этого в C++ есть специальная функция и флаг, делается это так: std::once_flag flag; //... class Class { Class() { std::call_once(flag, [this]{ SomeMethod(); }); } void SomeMethod() {...} } Таким образом мы вызовем SomeMethod() в конструкторе однажды, но это не запретит вызывать этот метод в других местах программы, поэтому его можно сделать приватным, но это не запретит вызов приватного метода в других методах класса. Для того, чтобы полностью исключить повторный вызов какого-либо кода, нужно весь этот код поместить в лямбду, которая передаётся в std::call_once std::once_flag flag; //... class Class { Class() { std::call_once(flag, [this] { // Тут будет код, который нужно вызывать лишь единожды }); } }

Ответ 2



Просто заведите статическую переменную-флаг и обрабатывайте его: foo::foo() { static bool once = true; if(once) { once = false; bar(); } } Второй вариант более элегантный, но работает только если bar возвращает какое-либо значение, то есть не void: int bar(); foo::foo() { static const auto once = bar(); }

Комментариев нет:

Отправить комментарий