STL map mit Klasse ohne Default Constructor



  • Hallo,

    kann ich eine STL map auch mit einer Klasse die keinen Default Constructor hat benutzen? Bei dem Beispiel scheint es zumindest deshalb zu knallen.

    #include <iostream>
    #include <map>
    
    class Base
    {
    public:
    	Base(int id) : m_id(id) 
    	{ 
    		std::cout << "Constructor " << m_id << std::endl; 
    	}
    
    	virtual ~Base() 
    	{ 
    		std::cout << "Destructor " << m_id << std::endl; 
    	}
    
    	int get_id() const 
    	{ 
    		return m_id;
    	}
    
    private:
    	int m_id;
    };
    
    int main (int args, char **argv)
    {
    	typedef std::map<int, Base> Container;
    	Container container;
    
    	container[1] = Base(1);
    
    	Container::const_iterator it = container.find(1);
    	if (it != container.end())
    	{
    		std::cout << it->second.get_id() << std::endl;
    	}
    }
    

    /usr/include/c++/3.2/bits/stl_map.h: In member function \_Tp& std::map<_Key, \_Tp, \_Compare, \_Alloc>::operator[](const \_Key&) [with \_Key = int, \_Tp = Base, \_Compare = std::less<int>, \_Alloc = std::allocator<std::pair<const int, Base> >]': main.cpp:31: instantiated from here /usr/include/c++/3.2/bits/stl_map.h:225: no matching function for call toBase
    ::Base()'
    main.cpp:5: candidates are: Base::Base(const Base&)
    main.cpp:7: Base::Base(int)
    make: *** [main.o] Error 1

    Grüße, MrC...



  • MrC... schrieb:

    kann ich eine STL map auch mit einer Klasse die keinen Default Constructor hat benutzen? Bei dem Beispiel scheint es zumindest deshalb zu knallen.

    Nicht zu knallen, sondern du erhälst einen sauberen Fehler des Compilers. Eine Möglichkeit dein Problem zu Umgehen wäre statt dem Objekt selber einen Zeiger (oder deutlich besser: boost::shared_ptr) zu verwenden. Ohne Standardkonstruktor kommst du sonst nicht weiter.

    cu André


  • Mod

    MrC... schrieb:

    kann ich eine STL map auch mit einer Klasse die keinen Default Constructor hat benutzen?

    Defaultkonstruierbarkeit ist keine allgemeine Bedingung, die an Containerelemente gestellt wird. Allerdings setzen einige Funktionen dieser Container diese Eigenschaft voraus und können bei Fehlen nicht verwendet werden. operator[] von std::map ist so ein Fall - hier müsstest du mit insert arbeiten.



  • die vermutung liegt allerdings nahe, dass du von Base auch ableiten willst. in diesem fall musst du sowieso auf zeiger umsteigen, da du polymorphie ja anscheinend benötigst.


Anmelden zum Antworten