Отдельная статическая переменная внутри функции-члена класса среди экземпляров - PullRequest
1 голос
/ 18 октября 2011
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 ++?

1010 * редактировать * Я забыл упомянуть, что у меня есть такие переменные во многих функциях.
Добавлен 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 ]

3 голосов
/ 18 октября 2011

Проблема в том, что все экземпляры MyClass имеют общую статическую переменную.

Именно это и есть переменная static.

Как я могу сделать переменную не общей для разных экземпляров (но общей для одного и того же экземпляра)?

Вам необходимо сделать isFirst (не static) членом 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;
    }
}

Если у вас действительно «есть такие переменные в многих функциях», то я рекомендую вам переосмыслить дизайн MyClass. Я не могу сказать вам, как, учитывая, насколько расплывчатым и обобщенным является ваш пример, но вы почти наверняка нарушаете Принцип единой ответственности .

3 голосов
/ 18 октября 2011

В вашем файле 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 голос
/ 18 октября 2011

Используйте переменную экземпляра в классе.Ожидается, что различные функции-члены одного класса будут тесно связаны и не будут давить друг на друга.

...