Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在实例之间分离类成员函数内的静态变量_C++_Variables_Static_Member - Fatal编程技术网

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

C++ 在实例之间分离类成员函数内的静态变量,c++,variables,static,member,C++,Variables,Static,Member,我已经使用了上面的结构,到目前为止,当我只使用该类的一个实例时,它工作得很好。 问题是MyClass的所有实例似乎都共享静态变量 如何使变量不被不同实例共享(而是在同一实例之间共享) 我是否需要维护单独的数据结构以将实例存储在某个位置? 或者这可以通过巧妙地使用C++语法来完成吗? 编辑 我忘了提到我在很多函数中都有这样的变量。 在上面添加了MyClass::Bar() 我希望有一种方法可以避免将isFirstForFoo、isFirstForBar等定义为类成员变量,因为变量太多了 我的实际代

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

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

我是否需要维护单独的数据结构以将实例存储在某个位置?
或者这可以通过巧妙地使用C++语法来完成吗? 编辑 我忘了提到我在很多函数中都有这样的变量。
在上面添加了MyClass::Bar() 我希望有一种方法可以避免将isFirstForFoo、isFirstForBar等定义为类成员变量,因为变量太多了

我的实际代码如下所示

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

MyClass::Bar()
{
  static bool isFirst = true;
  if (isFirst)
   do something;
  isFirst = false;
}
BookInfoVector\u t DBProcess\u GET\u BOOK::SelectBookList()
{   
const char*query=“一些查询语句”;
静态nsl::SQLitePreparedStatement preparedStatement=nsl::SQLitePreparedStatement(静态转换(mDBConnection),查询);
静态bool isFirst=true;
_InitializeDBProcess(&preparedStatement,isFirst);
...
}

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

在MyClass.h文件中:

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);
...
}
在构造函数中:

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

private:
  bool isFirst;
}
在您的方法中:

MyClass::MyClass() {
  isFirst = true;
}
您可能希望将
isFirst
now重命名为
mIsFirst
isFirst
或样式指南为成员变量推荐的任何名称,因为您现在已将其作为实例成员

您可能还希望在构造函数中使用初始值设定项列表,而不是在构造函数体中使用


以上内容留给读者作为练习。

在MyClass.h文件中:

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);
...
}
在构造函数中:

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

private:
  bool isFirst;
}
在您的方法中:

MyClass::MyClass() {
  isFirst = true;
}
您可能希望将
isFirst
now重命名为
mIsFirst
isFirst
或样式指南为成员变量推荐的任何名称,因为您现在已将其作为实例成员

您可能还希望在构造函数中使用初始值设定项列表,而不是在构造函数体中使用


以上内容留给读者作为练习。

在类中使用实例变量。单个类的各种成员函数应紧密耦合,而不是相互践踏数据。

在类中使用实例变量。单个类的各个成员函数应该是紧密耦合的,而不是相互践踏数据

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

这正是
静态变量的含义

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

您需要使
isFirst
成为
MyClass
的(非
static
)成员。并在编辑后将其重命名:

void MyClass::Foo()
{
  if (isFirst)
    do something;
  isFirst = false;
}
如果您真的“在许多函数中都有这样的变量”,那么我建议您重新考虑
MyClass
的设计。我不能告诉你怎么做,因为你的例子是如此模糊和一般,但你几乎肯定违反了规则

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

这正是
静态变量的含义

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

您需要使
isFirst
成为
MyClass
的(非
static
)成员。并在编辑后将其重命名:

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

如果您真的“在许多函数中都有这样的变量”,那么我建议您重新考虑
MyClass
的设计。考虑到您的示例是多么的模糊和泛化,我无法告诉您如何操作,但您几乎肯定违反了。

构造函数应该是
MyClass::MyClass():isFirst(true){}
。其他方面都很完美。是的,我在底部的注释中提到了初始化列表。只是尽量让事情简单易学。构造函数应该是
MyClass::MyClass():isFirst(true){}
。其他方面都很完美。是的,我在底部的注释中提到了初始化列表。只是尽量让事情简单易学。每次只做一件事。@Mysticial:显然不是,因为这会使它在调用之间失去价值。是的,你是对的,那里的措辞让我有点困惑…@Eugene:然后你相应地命名你的变量:
isFirstFoo
isFirstBar
,等等。@Ben:谢谢你的输入,还有其他方法吗?而不是“一次性标记”变量,您应该从构造函数执行初始化任务。否则,您应该使用非静态类属性<代码>静态
在所有实例之间泄漏,即使您将其嵌套在某个被遗忘的私有方法的最深块中。“oneshot标记”很有用,但如果您的类具有单音行为,例如打开一些未经攻击的I/O端口,然后所有实例都单独写入该I/O,即管理仲裁的类。@Mystical:显然不是,因为这会使它在调用之间失去价值。是的,您是对的,那里的措辞让我有点困惑…@Eugene:然后你相应地命名变量:
isFirstFoo
isFirstBar
,等等@Ben:谢谢你的输入,还有其他方法吗?你应该从构造函数执行初始化任务,而不是“一次性标记”变量。否则,您应该使用非静态类属性<代码>静态
在所有实例之间泄漏,即使您将其嵌套在某个被遗忘的私有方法的最深块中。不过,如果您的类具有单一行为,例如打开一些未经攻击的I/O端口,然后所有实例都单独写入该I/O,则“oneshot标记”很有用,因为类管理仲裁。