static members.
От: Mechanicus Беларусь  
Дата: 05.02.04 14:11
Оценка:
Вот натолкнулся на такую проблему с использованием субжа. Есть два модуля
module.cpp
#include "module.h"

#include <exception>
#include <iostream>
#include <boost/bind.hpp>

Module::worldFactory_t Module::worldFactory_;

bool Module::init()
{
    getWorld();

    return true;
}

int main()
{
    try {
        Module::create()->init();
    }
    catch (std::exception &ex) {
        std::cout << ex.what() << std::endl;
    }
    std::cout << "done." << std::endl;
    return 0;
}

module.h
#ifndef MODULE_H
#define MODULE_H

#include <boost/function.hpp>
#include <boost/utility.hpp>
#include <iostream>

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

        static Module *create() 
        {
            static Module obj_;
            return &obj_;
        }
        bool init();

    private:
        typedef boost::function0<World *> worldFactory_t;
        static worldFactory_t worldFactory_;
    };

#endif


и

world.cpp
#include "module.h"
#include "world.h"

namespace 
{
    World *create()
    {
        static World obj;
        return &obj;
    }

    static bool world_registered = 
        Module::registerWorld(create);
}


world.h
#ifndef AAA
#define AAA

#include <boost/utility.hpp>

class World : boost::noncopyable
{
};

#endif //AAA


При компиляции с помощю mingw(gcc-3.3.1) и выполнении этой программы стабильно на cout выдаётся
World is registered.
call to empty boost::function
done.
VC7.0 всё компилит и выполняет нормально. Я даже не знаю кто тут прав, вроде код верный, и VC прав, хотя кто его знает.
... << RSDN@Home 1.1.3 beta 1 >>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.