Как разработать метод класса можно вызвать только один раз - PullRequest
1 голос
/ 04 февраля 2020

У меня есть класс с состоянием, после создания экземпляра класса его функцию / метод Bar можно вызывать только один раз, иначе внутреннее состояние испортится. Как спроектировать такую ​​вещь?

Что-то может предупредить / ошибка во время компиляции будет лучше.

class  Foo {
  bool Bar(string arg...) { do something...}

  // some class member 
  string s;
  int i;
}

1 Ответ

0 голосов
/ 13 февраля 2020

Вы можете определить флаг stati c внутри Foo::Bar(), который отслеживает, была ли функция уже вызвана:

bool Foo::Bar() {
   static bool has_been_called; // initialized to false

   if (!has_been_called) {
      has_been_called = true
      // ...
      // do something
      // ...
      return true;
   }

   return false;
}

Для случая, когда несколько потоков могут вызывать функцию-член вместо этого вы можете использовать std::call_once(); так как чтение флага has_been_called выше не синхронизировано с записью.

bool Bar() {
   static std::once_flag flag;

   bool executed = false; 

   std::call_once(flag, [this, &executed]() {
      // ...
      // do something
      // ...
      executed = true;
   });
   return executed;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...