在实例之间的类成员函数内分离静态变量

时间:2011-10-18 03:31:35

标签: c++ variables static member

MyClass::Foo()
{
  static bool isFirst = true;
  if (isFirst)
    do something;
  isFirst = false;
}

MyClass::Bar()
{
  static bool isFirst = true;
  if (isFirst)
   do something;
  isFirst = false;
}

我使用了上面的结构,到目前为止,当我只使用一个类的实例时,它运行良好 问题是MyClass的所有实例似乎都共享静态变量。

如何使变量不被不同实例共享(但在同一实例之间共享)?

我是否需要维护一个单独的数据结构来存储实例? 或者这可以通过巧妙地使用c ++语法来完成吗?

修改

我忘了提到我在很多功能中都有这样的变量 在那里添加了MyClass :: Bar() 我希望有一种方法可以不定义isFirstForFoo,isFirstForBar等作为类成员变量,因为有这么多。

我的实际代码如下所示

BookInfoVector_t DBProcess_GET_BOOK::SelectBookList()
{   
    const char* query = "some query statement";

    static nsl::SQLitePreparedStatement preparedStatement = nsl::SQLitePreparedStatement(static_cast<nsl::SQLiteConnection*>(mDBConnection), query);
    static bool isFirst = true;
    _InitializeDBProcess(&preparedStatement, isFirst);
...
}

我在第一次运行代码时对prepareStatement进行了一些初始化,你可以想象,我必须为我使用的所有查询定义isFirst。

3 个答案:

答案 0 :(得分:3)

在MyClass.h文件中:

class MyClass {
public:
  MyClass();
  void Foo();

private:
  bool isFirst;
}

在你的构造函数中:

MyClass::MyClass() {
  isFirst = true;
}

在你的方法中:

void MyClass::Foo()
{
  if (isFirst)
    do something;
  isFirst = false;
}

您现在可能希望将isFirst重命名为mIsFirstisFirst_或类型指南建议的成员变量,因为您现在已将其设为实例成员。

您可能还希望在构造函数中使用初始化列表,而不是在构造函数体中执行它。

上面留下的作为读者的练习。

答案 1 :(得分:3)

  

问题是MyClass的所有实例似乎都共享静态变量。

这正是static变量。

  

如何使变量不被不同实例共享(但在同一实例之间共享)?

您需要isFirst成为static的{​​{1}}成员。并在编辑后重命名:

MyClass

如果你真的“在许多函数中有这样的变量”,那么我建议你重新考虑class MyClass { public: MyClass(); void Foo(); void Bar(); private: bool should_foo; bool should_bar; }; MyClass::MyClass() :should_foo(true) ,should_bar(true) { } void MyClass::Foo() { if (should_foo) { // do something; should_foo = false; } } void MyClass::Bar() { if (should_bar) { // do something; should_bar = false; } } 的设计。我不能告诉你,鉴于你的例子有多模糊和通用,但你几乎肯定违反了Single Responsibility Principle

答案 2 :(得分:1)

在类中使用实例变量。单个类的各种成员函数应该紧密耦合,而不是踩在彼此的数据上。