2016-06-21 18 views
1

Ich arbeite an einem generischen Parameterprüfer in C++, der Optionen hinzufügen und ihren Inhalt analysieren kann.Generischer Parameterprüfer in C++

Hier ist meine Param Klasse:

class Param 
{ 
public: 
    Param(); 
    ~Param(); 

    template <typename T> 
    void add_option(std::string, std::string, T&); // flag, description, storage value 

protected: 
    std::map<std::string, IOption> options; 
}; 

template <typename T> 
void Param::add_option(std::string, std::string, T&) // Is templated to add an option depending on its type 
{} 

template<> void Param::add_option<int>(std::string, std::string, int &); 
template<> void Param::add_option<std::string>(std::string, std::string, std::string &); 

Wie Sie möchte ich speichern neue Optionen in einem map sehen können, hier ist die Klasse Option und es ist "Schnittstelle":

template <typename T> 
class Option : public IOption 
{ 
public: 
    Option(std::string flag, std::string desc, T &ref) : flag_(flag), desc_(desc), ref_(ref) {} 
    ~Option() {} 

    std::string getFlag() 
    { 
    return (flag_); 
    } 

protected: 
    std::string flag_; 
    std::string desc_; 
    T    &ref_; 
}; 

class IOption 
{ 
public: 
    virtual ~IOption() {} 
    IOption() {} 

    virtual std::string getFlag() = 0; 
}; 

Der Grund, warum ich diese Schnittstelle erstellt habe, besteht darin, meine Optionen in der Map zu speichern, obwohl sie als Vorlage dienen.

Aber jetzt kann ich nicht kompilieren, weil

Feldtyp ‚iOption‘ eine abstrakte Klasse ist

Was ist der beste Weg, um einen generischen Parameter checker von dem, was ich wäre zu schaffen in C++ haben?

+2

Zeiger der IOption speichern? std :: map Weitere Informationen hier http://StackOverflow.com/Questions/15188894/Why-doesnt-Polymorphism-Work-without-Pointers-References – SnoozeTime

+2

@SnoozeTime oder noch besser [ Smart Pointer] (http://en.cppreference.com/w/cpp/memory/unique_ptr) – StoryTeller

Antwort

3

Sie können die Instanz der abstrakten Klasse nicht speichern. Sie sollten Zeiger oder Smart-Pointer verwenden und options Erklärung wie folgt ändern:

std::map<std::string, IOption*> options; 

oder

std::map<std::string, std::unique_ptr<IOption> > options; 

oder

std::map<std::string, std::shared_ptr<IOption> > options; 
+2

Wenn nicht etwas geteilt wird, spring nicht mit der Waffe und benutze 'shared_ptr', es hat Overhead, den du nicht brauchst . – StoryTeller

+0

@StoryTeller, ja, aber 'std :: unique_ptr' wird in diesem Kontext für Anfänger schwer zu verwenden sein – user2807083

+1

Besser mit einem unique_ptr, wenn der Param den Zeiger besitzt – SnoozeTime

1

Die Karte Klasse Speicher zuweisen für den Schlüssel/Wert-Paare benötigt Sie fügen hinzu. Definitionsgemäß können Sie eine Instanz einer abstrakten Klasse nicht instanziieren, sodass die Speichergröße nicht bestimmt werden kann.

Also ja, Zeiger oder intelligente Zeiger auf IOption zu speichern.