Map: Eigene Klasse als Value -> Fehler bei #include <map>
-
Hallo!
Ich würde gerne eine Map erzeugen, welche den aufbau map<int, eigeneKlasse> hat.
Aber sobald ich sage, dass der Value vom Typ eigeneKlasse ist, gibt es einen Fehler bei der include Anweisung im Header.
undzwar:In file included from /usr/lib/gcc/x86_64-pc-cygwin/4.8.3/include/c++/map:61:0, from ReisezielEuropa.h:12, from ReisezielEuropa.cpp:10: /usr/lib/gcc/x86_64-pc-cygwin/4.8.3/include/c++/bits/stl_map.h: In instantiation of 'std::map<_Key, _Tp, _Compare, _Alloc>::mapped_type& std::map<_Key, _Tp, _Compare, _Alloc>::operator[](const key_type&) [with _Key = int; _Tp = Reisezielinfo; _Compare = std::less<int>; _Alloc = std::allocator<std::pair<const int, Reisezielinfo> >; std::map<_Key, _Tp, _Compare, _Alloc>::mapped_type = Reisezielinfo; std::map<_Key, _Tp, _Compare, _Alloc>::key_type = int]': ReisezielEuropa.cpp:29:26: required from here /usr/lib/gcc/x86_64-pc-cygwin/4.8.3/include/c++/bits/stl_map.h:469:59: error: no matching function for call to 'Reisezielinfo::Reisezielinfo()' __i = insert(__i, value_type(__k, mapped_type()));Ich zeigs einfach mal:
Header-Datei mit dem Fehler#ifndef REISEZIELEUROPA_H #define REISEZIELEUROPA_H #include <fstream> #include "Reisezielinfo.h" #include <map> class ReisezielEuropa{ public: ReisezielEuropa(); void addziel(std::string, std::string,std::string,std::string); std::map<int, Reisezielinfo>::iterator createStartIterator(); std::map<int, Reisezielinfo>::iterator createEndIterator(); virtual ~ReisezielEuropa(); private: std::fstream myfile; std::map<int,Reisezielinfo> mapeuropa; int counter = 0; }; #endif /* REISEZIELEUROPA_H */Header-Datei der eigenen Klasse:
#ifndef REISEZIELINFO_H #define REISEZIELINFO_H #include <string> class Reisezielinfo{ public: Reisezielinfo(std::string,std::string, std::string, std::string); Reisezielinfo( const Reisezielinfo& orig ); virtual ~Reisezielinfo(); std::string GetId() const {return id;} std::string GetName() const {return name;} std::string GetEinwohner() const {return einwohner;} std::string GetLand() const {return land;} private: std::string id,name,land,einwohner; }; #endif /* REISEZIELINFO_H */Hauptteil der Eigenen Klasse
#include "Reisezielinfo.h" #include <string> Reisezielinfo::Reisezielinfo(std::string id,std::string ziel, std::string land, std::string einwohner) { this->id = id; name = ziel; this->land = land; this->einwohner = einwohner; } Reisezielinfo::Reisezielinfo(const Reisezielinfo& orig) { } Reisezielinfo::~Reisezielinfo() { }Sobald ich als Value etwas anderes angebe, funktioniert es...
Ich bin relativ unerfahren in C++ und bin überfordert.
Ich hoffe ihr könnt mir helfen.Grüße
-
Dafür brasucvhrt Reise4zielinfo einen Konstruktor ohne Atgumente.
Leider.
-
Wenn du den Destruktor ohne Argumente (Defaultkonstruktor) hinzufügst, solltest du den Copykonstruktor (mit const Reisezielinfo& orig) wegwerfen. Deine Klasse funktioniert auch ohne einen selbst geschriebenen, und deiner kopiert nichts.
Mit C++11 kann man auch ohne Defaultkonstruktor auskommen, der Code ist aber hässlich:
#include <map> #include <string> struct a { a( int, std::string ){} }; int main() { std::map<int,a> m; std::string text( "aaa" ); m.emplace( std::piecewise_construct, std::forward_as_tuple( 1 ), std::forward_as_tuple( 1, text ) ); }
-
volkard schrieb:
brasucvhrt
Was ist denn da passiert?

-
Die Aussage mit C++11 ziehe ich zurück, es geht auch schön:
#include <map> #include <string> struct a { a( int, std::string ){} }; int main() { std::map<int,a> m; std::string text( "aaa" ); m.emplace( 1, a{ 1, text } ); }
-
manni666 schrieb:
m.emplace( std::piecewise_construct, std::forward_as_tuple( 1 ), std::forward_as_tuple( 1, text ) );Klassischer Fall von "Habe keine Ahnung von C++11, einfach mal den Doku-Beispielcode von
emplace_backkopieren und minimal anpassen".
-
Hm, also lags an dem nicht vorhandenem Konstruktor...
Komme von Java und da wird der Standart-Konstruktor automatisch erzeugt
Naja, vielen Dank für eure Hilfe, jetzt funktioniert ist.
-
Eiren schrieb:
Hm, also lags an dem nicht vorhandenem Konstruktor...
Komme von Java und da wird der stan****-Konstruktor automatisch erzeugt
Wird er in C++ auch, aber nur, wenn man sonst keinen eigenen Konstruktor definiert hat. Und in Java ist das ebenfalls so. Anders wäre das auch doof, da man ja anscheinend ein Objekt vorliegen hat, das eine bestimmte Art der Konstruktion benötigt. Da wäre es eher ungünstig, wenn dann still und heimlich ein Konstruktor erzeugt würde, der nicht das tut, was man möchte.