Статические переменные в методах экземпляра

Скажем, у меня есть эта программа:

class Foo {
 public:
    unsigned int bar () {
        static unsigned int counter = 0;
        return counter++;
    }
};

int main ()
{
    Foo a;
    Foo b;
}

(Конечно, этот пример не имеет никакого смысла, так как я, очевидно, объявил бы "счетчик" как частный атрибут, но он должен только проиллюстрировать проблему).

Я хотел бы знать, как C++ ведет себя в этом виде ситуации: переменная будет "противостоять" в панели () методу быть тем же для каждого экземпляра?

11
задан Dave Danuve 29 January 2010 в 18:11
поделиться

5 ответов

Добро пожаловать в сообщество Python! Я все еще учусь, но имо Пайтон лучше, чем интерактивный язык данных.

В любом случае, ответ Игнасио об использовании модуля кода выглядит так, будто он может предоставить то, что вы хотите, по крайней мере, параллельно остановке IDL.

Еще одна вещь, которая может оказаться полезной, это переход в интерактивный режим Python и импорт программы. Затем с ним можно взаимодействовать, выполняя функции и т.д. (Надо признать, что я не эксперт в этом.) В этом случае в файле, управляющем программой, потребуется функция main (). Например, у вас будет что-то вроде:

import sys
def main():
    # do stuff
    return(0)

if __name__ == '__main__':
    sys.exit(main())

, а не просто:

# do stuff

Это предотвращает выполнение программы, когда вы втягиваете ее в интерпретатор Python. Для получения дополнительной информации см. статью Гвидо об основных функциях .

-121--3690527-

Вы ищете раздел проблемы для k наборов.

Существует сом-литература о k = 3, называемая проблемой 3-разбиения. Это NP полный в сильном смысле.

Существует много эвристики, которая должна дать приблизительный результат быстро.

Я предлагаю вам начать здесь: http://en.wikipedia.org/wiki/Partition_problem

Надеюсь, это поможет.

-121--4605378-

Да, счетчик будет использоваться совместно во всех экземплярах объектов типа Foo в исполняемом файле. Пока вы находитесь в одноадресной среде, она будет работать так, как ожидалось, как общий счетчик.

В многопоточной среде у вас будут интересные условия гонки для отладки:).

10
ответ дан 3 December 2019 в 08:29
поделиться

Даг, спасибо за быстрый ответ. Это отключило близкое действие. Однако он не скрывал «Х» в правом верхнем углу. В итоге я использовал css, чтобы скрыть «X.»

/* hide the close x on loading screen */
.classForMyDialog .ui-dialog-titlebar-close {
    display: none;
}
-121--3612679-

Под «быть одинаковым для каждого экземпляра» подразумевается наличие одного экземпляра этой переменной, общего для каждого экземпляра класса, то да, это правильно. Все экземпляры класса будут использовать один и тот же экземпляр переменной.

Но имейте в виду, что с переменными класса во многих случаях приходится учитывать такие вещи, как многопоточность, что является совершенно другой темой.

2
ответ дан 3 December 2019 в 08:29
поделиться
[11278337-

Ваш пример был пара вдали от того, что вы могли бы скомпилировать и тестировать:

#include <iostream>
using namespace std;
class Foo {
 public:
    unsigned int bar () {
        static unsigned int counter = 0;
        return counter++;
    }
};

int main ()
{
    Foo a;
    Foo b;

    for (int i=0; i < 10; i++)
      cout<<i<<". "<<a.bar()<<" / "<<b.bar()<<endl;
}

Выход выглядит так:

0. 1 / 0
1. 3 / 2
2. 5 / 4
3. 7 / 6
4. 9 / 8
5. 11 / 10
6. 13 / 12
7. 15 / 14
8. 17 / 16
9. 19 / 18

Так что да, счетчик разделяется во всех случаях.

1
ответ дан 3 December 2019 в 08:29
поделиться

Вам просто нужно понять две вещи:

  1. Статические переменные хранятся в статической области выполняющейся программы (которая такая же, как глобальная переменная).
  2. Область применения ограничена общим правилам скобок. Достаточно статические переменные имеют внутреннюю связь.
0
ответ дан 3 December 2019 в 08:29
поделиться

Из языка программирования C ++ (2-е издание) , Page 200, by Bjarne Stroustrup:

не используйте Static , за исключением внутри Простые] Функции (§7.1.2) и классы (§10.2.4).

1
ответ дан 3 December 2019 в 08:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: