Container für verschiedene Pointer



  • mach es anders;
    anstatt direkt den pointer zu speichern, kannst du den pointer doch selber wrappen

    struct PointerInfo
    {
       enum PointerType { PT_IBASE, PT_ICLASS, PT_IANOTHER };
       PointerType pointer_type;
       void *pointer;
    };
    

    dann hast du alles was du brauchst und kannst deine pointer einfach verwalten



  • Wie willst du denn ein Plugin benutzen wenn du nicht sein Interface kennst? Dann kannst du doch gar keine Funktionen davon aufrufen. Ich raff das nicht.



  • esskar schrieb:

    mach es anders;
    anstatt direkt den pointer zu speichern, kannst du den pointer doch selber wrappen

    struct PointerInfo
    {
       enum PointerType { PT_IBASE, PT_ICLASS, PT_IANOTHER };
       PointerType pointer_type;
       void *pointer;
    };
    

    dann hast du alles was du brauchst und kannst deine pointer einfach verwalten

    ich verstehe nicht ganz, wie du dann den void pointer casten willst....
    in enum speicherst du ja dann nur die ID's keine pointertypen,
    und zweitens, wie soll dann so in pseudocode so ein pluginmanager aussehen ?
    danke schon mal im vorraus



  • nixraff schrieb:

    Wie willst du denn ein Plugin benutzen wenn du nicht sein Interface kennst? Dann kannst du doch gar keine Funktionen davon aufrufen. Ich raff das nicht.

    doch, interface kenne ich ja dann schon, weil es includet wird, nur das problem ist dabei, pluginmanager hat keine funktion vorraus deklariert genau auf diesen pointertyp zuzugreifen, falls es ein neuer plugin ist, mit neuem interface, da der pluginmanager in einer dll liegt und nicht mehr zu ändern wäre



  • keine Vorstellungskraft? 🙂

    typedef std::map< PointerInfo, std::string > PluginContainer;
    PluginContainer m_container; 
    
    void AddPluginPointer(PointerInfo & pi, const std::string & name)
    {
       m_container.insert(PluginContainer::value_type(pi, name));
    }
    
    void AddPluginIBase(IBase *ptr, const std::string & name)
    {
       PointerInfo pi;
       pi.pointer = (void *)ptr;
       pi.pointer_type = PointerInfo::PointerType::PT_IBASE;
    
       AddPluginPointer(pi, name);
    }
    
    void AddPluginIClass(IClass *ptr, const std::string & name)
    {
       PointerInfo pi;
       pi.pointer = (void *)ptr;
       pi.pointer_type = PointerInfo::PointerType::PT_ICLASS;
    
       AddPluginPointer(pi, name);
    }
    
    void PluginAction()
    {
       PluginContainer::const_iterato iter;
    
       iter = m_container.begin();
       while(iter != m_container.end())
       {
          switch(iter->first.pointer_type)
          {
             case PointerInfo::PointerType::PT_IBASE:
                {
                   IBase *ibase = (IBase *)iter->first.pointer;
                   // mach was mit ibase
                }
                break;
    
             case PointerInfo::PointerType::PT_ICLASS:
                {
                   IClass *iclass = (IClass *)iter->first.pointer;
                   // mach was mit iclass
                }
                break;
          }
          ++iter;
       }
    }
    


  • WeiserCoder schrieb:

    nixraff schrieb:

    Wie willst du denn ein Plugin benutzen wenn du nicht sein Interface kennst? Dann kannst du doch gar keine Funktionen davon aufrufen. Ich raff das nicht.

    doch, interface kenne ich ja dann schon, weil es includet wird, nur das problem ist dabei, pluginmanager hat keine funktion v****** deklariert genau auf diesen pointertyp zuzugreifen, falls es ein neuer plugin ist, mit neuem interface, da der pluginmanager in einer dll liegt und nicht mehr zu ändern wäre

    Genau das versteht ja nixraff nicht, und ich übrigens auch nicht.
    Darf man mal fragen, was der Plugin-Manager macht? Und speziell was du dir vorstellst was der Plugin-Manager mit unbekannten Plugins machen soll?



  • Wenn du nicht nen einheitliches Interface schaffst, dann bleibt dir nur Esskar's Vorschlag übrig und ich finde den für nen Plug-In System mehr schlecht als recht.

    btw. hi esskar 🙂



  • SirLant schrieb:

    btw. hi esskar 🙂

    OT:
    hi. so sieht man sich wieder.
    da es auf perl-community ja zum ausfall kam, musste ich nun wieder hier meinen alten account ausgraben um mein Bedürfnis Hilfe zu geben, befriedigen zu können. 😉



  • oki jungs, danke schön,

    habe jetzt alle plugins von einer leeren abstrakten klasse IPlugin abgeleitet, jetzt gehts, so habe ich eine einheitliche interface für alle

    😉



  • WeiserCoder schrieb:

    oki jungs, danke schön,

    habe jetzt alle plugins von einer leeren abstrakten klasse IPlugin abgeleitet, jetzt gehts, so habe ich eine einheitliche interface für alle

    😉

    und genau so soll es sein


Anmelden zum Antworten