|
|
  |
Объекты в C++ |
|
|
|
Dec 21 2010, 18:50
|
Частый гость
 
Группа: Участник
Сообщений: 126
Регистрация: 14-11-10
Пользователь №: 60 879

|
Цитата(sergeeff @ Dec 22 2010, 00:17)  Порядок вызова глобальных конструкторов не регламентирован. Т. е., получается, что мы не знаем, какой объект создастся первым, а какой последним? А если, к примеру, объект 2 зависит от объекта 1 и объект 1 должен быть создан до объекта 2 (применительно к классам)?
|
|
|
|
|
Dec 21 2010, 19:15
|
Местный
  
Группа: Свой
Сообщений: 466
Регистрация: 21-06-05
Пользователь №: 6 205

|
Именно, даже существуют методики, которые гарантируют что обьект А будет создан раньше обьекта Б. А вообще, если у вас сильная зависимость между классами, то возможно, следует пересмотреть иерархию классов. Чтоб не быть голословным, вот пример: Код class SomeFoo { public: int func1() { ... }; };
/* функция возвращает ссылку на обьект типа SomeFoo */ SomeFoo& some_func() { /* статически создаем обьект типа SomeFoo */ static SomeFoo myClass; /* возвращаем ссылку на статический обьект */ return myClass; }
class SomeOtherClass { public: my_other_func() { int some_value = some_func().func1(); }; }; надеюсь из кода все понятно. Общий смысл в том, что в функции создается статический объект, ссылка на который, потом возвращается туда куда нам надо. Мне такой трюк нужен был только однажды, да и то, потом как-то обошлось, поменял немного архитектуру.
|
|
|
|
|
Dec 21 2010, 19:44
|
Частый гость
 
Группа: Участник
Сообщений: 126
Регистрация: 14-11-10
Пользователь №: 60 879

|
Фактически, ситуация следующая (возможно, посоветуете что-нибудь лучше). Допустим, в проекте есть несколько глобальных переменных, которые используются в нескольких модулях. Мы преследуем две цели: задать порядок создания и облегчить включение глобальных переменных в несколько модулей. Создаем "x.cpp", в котором определяем все наши глобальные объекты, в файле "x.hpp" объявляем все эти объекты, используя директиву "extern". Далее инклудим файл "x.hpp" в нужные нам .cpp. Цитата Но все это нестандандартно и от лукавого Понимаю теперь, будем от этого уходить
|
|
|
|
|
Dec 22 2010, 01:54
|

Adept
     
Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343

|
Цитата(spongebob @ Dec 22 2010, 04:44)  Фактически, ситуация следующая (возможно, посоветуете что-нибудь лучше). Допустим, в проекте есть несколько глобальных переменных, которые используются в нескольких модулях. Мы преследуем две цели: задать порядок создания и облегчить включение глобальных переменных в несколько модулей. Создаем "x.cpp", в котором определяем все наши глобальные объекты, в файле "x.hpp" объявляем все эти объекты, используя директиву "extern". Далее инклудим файл "x.hpp" в нужные нам .cpp. Да, для одной единицы трансляции гарантируется порядок создания объектов. Если зависимые объекты размещать в одной единице трансляции, то проблем нет. В противном случае надо применять разного рода трюки - например, уже не раз тут (на форуме) упоминавшийся singleton.
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
|
Dec 22 2010, 04:26
|

Нечётный пользователь.
     
Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417

|
Цитата(kurtis @ Dec 22 2010, 00:15)  Общий смысл в том, что в функции создается статический объект, ссылка на который, потом возвращается туда куда нам надо. Всё так, только инициализируется этот объект именно в момент вызова функции (собственно, для гарантии наличия, функция-то может вызываться и из других конструкторов), что тянет за собой дополнительную флаговую переменную со смыслом bool initialised; и соответствующий код. А при отсутствии (это я уже о gcc) -fno-threadsafe-statics там ещё и мьютексы __cxa_guard_* В мелких мелкоконтроллерах жаба давить начинает. Цитата(kurtis @ Dec 22 2010, 00:15)  Мне такой трюк нужен был только однажды, да и то, потом как-то обошлось, поменял немного архитектуру.
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|