Frage

Ich habe C ++ gelernt, von C # kommt, wo ich mit Dienstleistern gewöhnt haben: im Grunde ein Dictionary . Leider kann ich nicht herausfinden, wie dies in C ++ zu tun. So sind die Fragen im Grunde:

  1. Wie würde ich ein Wörterbuch in C ++ zu machen.

  2. Wie würde ich 'Typen' verwenden, um mit ihm, soweit ich weiß, gibt es keinen 'Typen' in C ++.

  3. Wie oben, aber mit 'Objekt'.

Danke!

War es hilfreich?

Lösung

Ich gehe davon aus, dass Sie eine Art zu einem einzigen Objektinstanz abzubilden versuchen. Man könnte etwas in dieser Richtung versuchen:

#include <typeinfo>
#include <map>
#include <string>
using namespace std;

class SomeClass
{
public:
    virtual ~SomeClass() {} // virtual function to get a v-table
};

struct type_info_less
{
    bool operator() (const std::type_info* lhs, const std::type_info* rhs) const
    {
        return lhs->before(*rhs) != 0;
    }
};

class TypeMap
{
    typedef map <type_info *, void *, type_info_less> TypenameToObject;
    TypenameToObject ObjectMap;

public:
    template <typename T> 
    T *Get () const
    {
        TypenameToObject::const_iterator iType = ObjectMap.find(&typeid(T));
        if (iType == ObjectMap.end())
            return NULL;
        return reinterpret_cast<T *>(iType->second);
    }
    template <typename T> 
    void Set(T *value) 
    {
        ObjectMap[&typeid(T)] = reinterpret_cast<void *>(value);
    }
};

int main()
{
    TypeMap Services;
    Services.Set<SomeClass>(new SomeClass());
    SomeClass *x = Services.Get<SomeClass>();
}

In C ++ Typen sind nicht erstklassige Objekte in ihrem eigenen Recht, aber zumindest der Typname wird eindeutig sein, so können Sie mit diesem Schlüssel können.

Edit:. Die Namen sind nicht wirklich einzigartig sein garantiert, so halten Sie sich an die type_info Zeiger verwenden, bevor Methode, sie vergleichen

Andere Tipps

Sie wollen wahrscheinlich auf der Karte Vorlage STL suchen. C ++ hat sicherlich Typen haben (schwer zu haben Vererbung ohne es), nur keine spezifische definiert „Typ“ Klasse.

Die STL hat zwei assoziative Container: std::map<K,V> andstd :: multimap. Es gibt auch std::set<V>, die einen Adapter von std::map<V,void> sein sollten, aber als solche ist sie nicht ein assoziativer Container. Die multimap ist auf der Karte ähnlich, nur erlaubt es mehrere identische Schlüssel im selben Behälter. Sowohl Karte und multimap halten Elemente vom Typ std::pair<K,V>. Mit anderen Worten, std::map<K,V>::value_type == std::pair<K,V>, aber std::map<K,V>::key_type == K und std::map<K,V>::mapped_type == V.

Wie für „Typ“, ich bin nicht ganz sicher, was Sie meinen. Wenn Sie parametrisierte Klassen bedeuten dann C ++ nennt die „Template-Programmierung“ oder „Generic Programming“. In dem obigen ist std::map<K,V> parametrisierte über K und V für den Typ und die Werte Schlüssel-Typ. C ++ unterstützt auch Template-Funktionen:

template<typename T>
void f(T o);

eine Funktion deklarieren, die jede Art überhaupt als Parameter, einschließlich der Urtyp. C ++ unterstützt keine generische Typ Auflösung, so dass die Art T Most bestimmter Hierarchie. Vorerst alles, was Sie tun können, ist einfach davon ausgehen, die übergebene Typ in der Tat der richtige Hierarchie ist, und der Compiler wird sich beschweren, wenn Sie versuchen, eine nicht deklarierte Funktion über ein Objekt dieser Art zu nennen.

template<typename T>
void f(T o) {
    o.do_it();
}

Die oben arbeiten, solange T die Methode do_it() definiert.

Ein Wörterbuch klingt wie eine STL Karte zu mir: std::map<K, T>. Werfen Sie einen Blick auf die Standard Template Library - es ist brillant. Es ist eine Zeit lang Teil des ANSI C ++ gewesen. Microsoft hat eine schöne Umsetzung von PJ Plauger, wenn ich mich richtig erinnere.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top