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标记”很有用,因为类管理仲裁。