Здравствуйте, slavo, Вы писали:
S>День добрый, как гарантированно создать экземпляр класс CClass раньше, чем создастся экземпляр любого другого класса?
заюзать singleton.
Здравствуйте, Kubroid, Вы писали:
K>заюзать singleton.
а если не юзать singleton? У меня есть набор статических функций, которые реализованы в файле х.срр. Мой объект должен быть создан до обращения к любой из этих функций. Если я напишу в файле х.срр строку:
static CClass MyObject;
то гарантирует ли это то, что объект будет создан до обращения к этим функциям? Они ведь в одном объектном файле.
Здравствуйте, slavo, Вы писали:
S>День добрый, как гарантированно создать экземпляр класс CClass раньше, чем создастся экземпляр любого другого класса?
Поместить определение этого объекта до всех остальных. При этом надо учесть, что это будет работать только для одной единицы трансляции.
Of course, the code must be complete enough to compile and link.
Здравствуйте, slavo, Вы писали:
S>Здравствуйте, Kubroid, Вы писали:
K>>заюзать singleton.
S>а если не юзать singleton? У меня есть набор статических функций, которые реализованы в файле х.срр. Мой объект должен быть создан до обращения к любой из этих функций. Если я напишу в файле х.срр строку: S>
S>static CClass MyObject;
S>
S>то гарантирует ли это то, что объект будет создан до обращения к этим функциям? Они ведь в одном объектном файле.
Проверил, так не работает.
Re[3]: Как создать объект раньше остальных?
От:
Аноним
Дата:
28.08.07 13:45
Оценка:
Здравствуйте, slavo, Вы писали:
K>>заюзать singleton. S>а если не юзать singleton?
А аргументы против этого метода имеются?
Здравствуйте, slavo, Вы писали:
S>День добрый, как гарантированно создать экземпляр класс CClass раньше, чем создастся экземпляр любого другого класса?
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, slavo, Вы писали:
K>>>заюзать singleton. S>>а если не юзать singleton? А>А аргументы против этого метода имеются?
Возможно будет медленнее работать из-за потерь на вход в критическую секцию и проверку флага создания.
Здравствуйте, Lorenzo_LAMAS, Вы писали:
S>>то гарантирует ли это то, что объект будет создан до обращения к этим функциям? Они ведь в одном объектном файле.
L_L>Кто у тебя будет вызывать эти функции ?
Функции вызываются кем угодно. Экземпляры любых других классов теоритически могут их вызывать.
Здравствуйте, Кодт, Вы писали:
К>Здравствуйте, slavo, Вы писали:
S>>День добрый, как гарантированно создать экземпляр класс CClass раньше, чем создастся экземпляр любого другого класса?
К>А зачем?
Чтобы гарантированно его использовать тогда, когда это потребуется.
К>Гарантированно — никак.
Здравствуйте, slavo, Вы писали:
S>Здравствуйте, Kubroid, Вы писали:
K>>заюзать singleton.
S>а если не юзать singleton? У меня есть набор статических функций, которые реализованы в файле х.срр. Мой объект должен быть создан до обращения к любой из этих функций. Если я напишу в файле х.срр строку: S>
S>static CClass MyObject;
S>
S>то гарантирует ли это то, что объект будет создан до обращения к этим функциям? Они ведь в одном объектном файле.
Гарантированно нельзя. Порядок создания объектов для разных модулей не определён.
Синглетон тоже не подойдёт, т.к. по идее он должен создаваться по требованию в единственном числе, а не раньше всех.
Да и не понятно зачем создавать объект гарантированно раньше других.
Может вам надо создать раньше других объектов того же типа?
Здравствуйте, alzt, Вы писали:
A>Здравствуйте, slavo, Вы писали:
S>>Здравствуйте, Kubroid, Вы писали:
K>>>заюзать singleton.
S>>а если не юзать singleton? У меня есть набор статических функций, которые реализованы в файле х.срр. Мой объект должен быть создан до обращения к любой из этих функций. Если я напишу в файле х.срр строку: S>>
S>>static CClass MyObject;
S>>
S>>то гарантирует ли это то, что объект будет создан до обращения к этим функциям? Они ведь в одном объектном файле.
A>Гарантированно нельзя. Порядок создания объектов для разных модулей не определён. A>Синглетон тоже не подойдёт, т.к. по идее он должен создаваться по требованию в единственном числе, а не раньше всех. A>Да и не понятно зачем создавать объект гарантированно раньше других. A>Может вам надо создать раньше других объектов того же типа?
singleton проблему решает, просто не хотелось постоянно дергать GetInstance. Но видно, никуда не деться. Сделал singleton.
Здравствуйте, slavo, Вы писали:
S>singleton проблему решает, просто не хотелось постоянно дергать GetInstance. Но видно, никуда не деться. Сделал singleton.
А каким образом он решает проблему? Можно пример кода?
Здравствуйте, slavo, Вы писали:
S>День добрый, как гарантированно создать экземпляр класс CClass раньше, чем создастся экземпляр любого другого класса?
В общем случае никак.
С глобальными и статическими данными можно всегда так извратиться,
что будет не так, как тебе хочется.
Определи лучше у себя в системе некую функцию Init
в которой ты вручную будешь все, что требуется, сам инициализировать.
Здравствуйте, slavo, Вы писали:
К>>А зачем? S>Чтобы гарантированно его использовать тогда, когда это потребуется.
Неполный ответ. Когда потребуется — это когда?
Две разных ситуации:
1) Нужно получить гарантии, что объект инициализируется до первого явного обращения к нему.
Да, это синглетон. Причём оба штатных С++ных синглетона — глобальная переменная и синглетон Майерса — это обеспечивают. Для более навороченных случаев (потокобезопасность, хитрые политики управления жизнью и смертью) — можно написать и хитрые синглетоны.
И то, при создании кольцевых зависимостей получишь лотерею.
extern int x, y, z, t;
.....
// компилятор с линкером разрулят, что y зависит от xint x = printf("initialize x\n")+rand();
.....
int y = printf("initialize y\n")+x;
// кольцевая зависимостьint z = printf("initialize z\n")+t;
.....
int t = printf("initialize t\n")+z;
2) Нужно получить гарантии, что код (конструктора) вызовется до определённого момента.
Например, это регистратор метаданных, фабрики класса и т.п.
Так вот, здесь уж точно К>>Гарантированно — никак.
Здравствуйте, slavo, Вы писали:
S>>>День добрый, как гарантированно создать экземпляр класс CClass раньше, чем создастся экземпляр любого другого класса?
К>>А зачем?
S>Чтобы гарантированно его использовать тогда, когда это потребуется.
Это называется "что будет, если всёпробивающее ядро попадёт в непробиваемую стену?"
А что будет если появится ещё один такой объект? Произойдёт коллапс проекта?
Здравствуйте, slavo, Вы писали:
S>День добрый, как гарантированно создать экземпляр класс CClass раньше, чем создастся экземпляр любого другого класса?
Идиома Schwarz Counter позволяет обеспечить гарантированный порядок инициализации объектов со static storage duration.
Здравствуйте, slavo, Вы писали:
K>>>>заюзать singleton. S>>>а если не юзать singleton? А>>А аргументы против этого метода имеются?
S>Возможно будет медленнее работать из-за потерь на вход в критическую секцию и проверку флага создания.
А это уже измышления вокруг конкретной реализации конкретной разновидности синглетона.
Нужно сперва разрулить проблемы в архитектуре, а потом уже ловить блох в производительности.
Вот не факт, что синглетон — это то, что вообще нужно.
До тех пор, пока ты не раскроешь карты, слова "синглетон" и "гарантии" — не более чем buzzword.