Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > не работает static


Автор: BearFear 9.12.2012, 15:30
Код
Код

// где то внутри одного хедера
class Class {
public:
    Class() {
        printf("iam %p\n", this);
    }
};
static Class _Class;

// а где то там вне хедера в разных местах подключается этот хедер (файлов реально дофигища! Выкладывать сюда свыше 40 модулей считаю кащунством)


Результат
iam 00433170
iam 00433128
iam 00433104
iam 004330DC
iam 004330B8
iam 00433094
iam 0043306C
iam 00433044
iam 00433020

Вопрос
Почему?

Добавлено через 11 минут и 16 секунд
Как вобще static может позволить создать несколько экземпляров по одному объявлению?

Автор: 586 9.12.2012, 15:49
Цитата
Результат
iam 00433170
iam 00433128
iam 00433104
iam 004330DC
iam 004330B8
iam 00433094
iam 0043306C
iam 00433044
iam 00433020

Вопрос
Почему?

В каждом cpp-шнике, где подключен этот h-ник, создался экземпляр класса.

Автор: BearFear 9.12.2012, 15:51
586, протягивать все через extern?

Добавлено @ 15:53
Или создавать сигнлтон с множеством разнообразных неупорядоченных переменных и объектов используемых везде где только можно? :(

Делать класс статических экземпляров статическим недопустимо, так как на все приложение от силы используется 3-4 объекта статических. Остальные в разных местах уникальны. Блин :( Руки бы выдрать этому кодеру :(

Автор: BearFear 9.12.2012, 16:09
Нашел одно из решений.
http://www.gamedev.ru/code/forum/?id=20237

Автор: BearFear 9.12.2012, 17:07
А почему для этих целей может не подойти синглтон?

Цитата


const
    Можно применять паттерн синглтон для этого.

Coriolan
    Но не нужно.

Автор: volatile 9.12.2012, 17:50
Цитата(BearFear @  9.12.2012,  16:09 Найти цитируемый пост)
Нашел одно из решений.

Если не озвучена проблема, какое решение вы ждете?

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

Автор: BearFear 9.12.2012, 18:25
Проблема озвучена выше smile Есть масса неиспользуемых объектов smile Я к проекту прикручиваю средства отладки потоков, а точнее некоторые фишки для вывода состояний потоков. Первый запуск показал наличие большого кол-ва неиспользуемых объектов критических секций. На данный момент загнал все с синглтон, теперь создается всего один глобальный экземпляр класса содержащий один объект критической секции с всеобщим доступом. Это КС чтения\записи файла конфигурации, их не предусмотрено множество, их предусмотрено один. В общем вот. Если честно не разу просто не сталкивался с таким, думал что ifndef и define обезопасивают от таких моментов. Но сей конфуз оказалось не зависит от защиты  ifndef и define. Ошибок данные статики не производили, множественное кол-во статиков обнаружил скажем так случайно, при запуске проги с своеобразными (мно написанными) макрос-конфигами. Оказалось что где то в исходниках валяется хедер содержащий это объявление. В общем все ок, все решилось. Всем спасибо за помощь!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)