проблема инициализатора с плагинами.тест - PullRequest
0 голосов
/ 01 июля 2011

У меня был более длинный и сложный вопрос, и у меня есть этот код http://www.ideone.com/VEOvp

Однако я упросту его.Что-то не так с приведенным ниже кодом и есть ли лучший способ сделать следующее?

Меня беспокоит эта строка std::list<Plugin*>& plugins и как ее установить, сохраняя при этом ссылку.Но я позволю вам, ребята, выбрать код отдельно.

#include <list>
#include <string>
class Plugin{
public:
    static std::list<Plugin*>*plugins;
    std::string name;
    Plugin(const std::string&n) : name(n)
    {
      static std::list<Plugin*> plugins;
      this->plugins=&plugins;
      plugins.push_back(this);
    }
};

//main.cpp
#include "plugin.h"

class Plugin1 : public Plugin{
public:
    Plugin1():Plugin("1"){}
};

static Plugin1 plugin;


std::list<Plugin*>* Plugin::plugins;
std::list<Plugin*>& plugins = *Plugin::plugins; //global name plz
int main(){
    for(auto c=plugins.cbegin(); c!=plugins.cend(); ++c) {
        printf("%s\n", (*c)->name.c_str());
    }
}

//PluginA.cpp
#include "plugin.h"

class PluginA : public Plugin{
public:
    PluginA():Plugin("A"){}
};

static PluginA plugin;

Ответы [ 2 ]

1 голос
/ 01 июля 2011

Это выглядит странно для меня. Если ваша цель - иметь какой-то глобальный плагин-контейнер / менеджер, есть ли причина не использовать одноэлементный шаблон, подобный этому:

class PluginContainer {
    static PluginContainer& instance() 
    { 
        static PluginContainer* m_this = 0;
        if(!m_this) 
             m_this = new PluginContainer;
        return *m_this;
    }

    void register(Plugin* plugin) { ... add to a list ... }
    const list<Plugin*>& plugins() const { ... return it ... }

    protected:
        PluginContainer() {}
};

class Plugin{
    public:
    Plugin(const std::string& n) : name(n)
    {
         PluginContainer::instance().register( this );
    }
    private:
    std::string name;
};
0 голосов
/ 01 июля 2011

Я изменил 2 строки и добавил ForceInit. Это должно быть безопасно, но не подтверждено.

Plugin(const std::string&n) : name(n){ static std::list<Plugin*> plugins; this->plugins=&plugins; if(n.length()==0) return; plugins.push_back(this); }
static std::list<Plugin*>* ForceInit() { Plugin d(""); return plugins; }

std::list<Plugin*>& plugins = *Plugin::ForceInit(); //global name plz
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...