Listing 1

// Plugin.h

#include "SharedLibrary.h"
#include <memory>
#include <string>
#include <map>

#ifdef _WIN32
#define DLLEXPORT _declspec(dllexport)
#else

#define DLLEXPORT
#endif

class DLLEXPORT Plugin
{
  public:
    Plugin(const char* plugin_name, const char* plugin_type)
    : m_plugin_name(plugin_name), m_plugin_type(plugin_type) {}

    virtual const char* pluginName() const;
    virtual const char* pluginType() const;

  // ...
};

typedef Plugin* (*plugin_init_func)(void);

class DLLEXPORT PluginManager
{
  public:
      static PluginManager& instance();

      Plugin& findPlugin(const char* name)
      throw (SharedLibraryException);

    private:
        struct PluginInfo {
        SharedLibrary* m_library;
        std::string m_library_name;
        Plugin* m_plugin;

        ~PluginInfo() { delete m_plugin; delete m_library; }
        PluginInfo() : m_library(0), m_plugin(0) {}
    };
    PluginManager() {}
    static PluginManager* ms_instance;
    std::map<std::string,PluginInfo* > m_plugin_map;
    // ...
};