Re: static members.
От: Павел Кузнецов  
Дата: 05.02.04 15:37
Оценка: 3 (1) +1
Здравствуйте, Mechanicus, Вы писали:

M> module.cpp

M>
 M> . . .
 M> Module::worldFactory_t Module::worldFactory_;
 M> . . .
 M>


M> module.h

M>
 M> . . .
 M>  class Module
 M>  {
 M>  public:
 M>   static bool registerWorld(World *(*createFn)())
 M>   {
 M>    std::cout << "World is registered." << std::endl;
 M>    worldFactory_ = createFn;
 M>    return true;
 M>   }
 M>   . . .
 M>


M> world.cpp

M>
 M> . . .
 M>  static bool world_registered = Module::registerWorld(create);
 M> . . .
 M>


M> При компиляции с помощю mingw(gcc-3.3.1) и выполнении

M> этой программы стабильно на cout выдаётся World is registered.
M> call to empty boost::function
M> done.

Подозреваю, что сначала вызывается registerWorld, а затем — конструктор
boost::function для объекта Module::worldFactory_, что приводит к обнулению
указателя, в нем содержащегося.

M> VC7.0 всё компилит и выполняет нормально. Я даже не знаю кто тут прав, вроде

M> код верный, и VC прав, хотя кто его знает.

Оба правы: стандарт не гарантирует порядок инициализации глобальных объектов в
разных единицах трансляции.

Для решения можно, например, заменить статическую переменную-член worldFactory_
на статическую функцию вида:
/* static */
Module::worldFactory_t& Module::worldFactory_()
{
  static Module::worldFactory_t theFactory;
  return theFactory;
}
Posted via RSDN NNTP Server 1.7 "Bedlam"
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.