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。
答案 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
重命名为mIsFirst
或isFirst_
或类型指南建议的成员变量,因为您现在已将其设为实例成员。
您可能还希望在构造函数中使用初始化列表,而不是在构造函数体中执行它。
上面留下的作为读者的练习。
答案 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)
在类中使用实例变量。单个类的各种成员函数应该紧密耦合,而不是踩在彼此的数据上。