C++ 如何设计类方法只能调用一次

C++ 如何设计类方法只能调用一次,c++,class,oop,design-patterns,C++,Class,Oop,Design Patterns,我有一个有状态的类,一旦创建了一个类实例,它的Bar函数/方法只能被调用一次,否则内部状态就会混乱。如何设计这样的东西 在编译时可以发出警告/错误的东西会更好 class Foo { bool Bar(string arg...) { do something...} // some class member string s; int i; } 您可以在Foo::Bar()中定义一个静态标志,用于跟踪函数是否已被调用: bool Foo::Bar() { stat

我有一个有状态的类,一旦创建了一个类实例,它的Bar函数/方法只能被调用一次,否则内部状态就会混乱。如何设计这样的东西

在编译时可以发出警告/错误的东西会更好

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

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

您可以在
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;
}
对于多个线程可能调用成员函数的情况,您可以 改用,;由于标记
的读取被调用
,因此上面的标记与写入不同步

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

   bool executed = false; 

   std::call_once(flag, [this, &executed]() {
      // ...
      // do something
      // ...
      executed = true;
   });
   return executed;
}

您可以在
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;
}
对于多个线程可能调用成员函数的情况,您可以 改用,;由于标记
的读取被调用
,因此上面的标记与写入不同步

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

   bool executed = false; 

   std::call_once(flag, [this, &executed]() {
      // ...
      // do something
      // ...
      executed = true;
   });
   return executed;
}

bool bar_中的私有变量被称为_u=false
boolbar(){if(Bar_called_)返回false;//或抛出异常
后跟
Bar_called=true;
谢谢Dave,我刚刚编辑了这个问题:编译时的某些内容更可取。我在代码中看到了一些东西:1.注释说它应该使用一次。2.在调用Bar()时重置状态。我猜编译时的任何东西都可能只是将上述内容隐藏在宏或类或类似内容中,或者使Bar成为构造函数的一部分,但可能其他人会提供建议。我担心您无法在编译时实现这种行为,至少如果您希望能够从项目的任意部分调用Bar,则不能。这项技术nique通常被称为“typestate编程”,并且(据我所知)只能用一种具有线性类型系统的语言来完成(即,您可以从范围中删除“用完”的变量)。下面是类
bool bar_中的一个私有变量,名为=false;
bool bar(){if(bar_称为u)返回false;//或抛出异常
后跟
bar\u called=true;
谢谢Dave,我刚刚编辑了这个问题:在编译时最好使用一些东西。我在代码中看到了一些东西:1.注释说它应该使用一次。2.在调用bar()时重置状态。我猜编译时的任何东西都可能只是将上述内容隐藏在宏或类或类似内容中,或者使Bar成为构造函数的一部分,但可能其他人会提供建议。我担心您无法在编译时实现这种行为,至少如果您希望能够从项目的任意部分调用Bar,则不能。这项技术nique通常被称为“类型状态编程”(typestate programming),并且(据我所知)只能在具有线性类型系统的语言中完成(即,您可以从范围中删除“用完”的变量)