No matching function...
-
Hallo zusammen,
ich habe eine Klasse BL (für Bundesländer) geschrieben und möchte
5 Obejkte initialisieren (erstmal mit den gleichen 3 Werten).Ich bekomme vom Compiler immer die Meckeransage:
28 C:\Programme\Dev-Cpp\main.cpp no matching function for call to `BL::SetBundesland(const char[7], int, const char[9])'Weiß jemand wo ich den Fehler gemacht habe?
Ich seh den Wald vor lautet Bäumen nicht.Viele dank!
#include <cstdlib> #include <iostream> using namespace std; class BL { private: string name; float einwohner; string hauptstadt; public: void SetBundesland(string &n, float &e, string &h); float printGroesse() {return(einwohner);}; }; void BL::SetBundesland(string &n, float &e, string &h) {name=n; einwohner=e; hauptstadt=h; } main() { BL b[5]; for (int i=0; i<5; i++) { b[i].SetBundesland("Bayern",1000,"Muenchen"); } }
-
In SetBundesland erwartest du ja auch Referenzen auf Variablen. Versuch's doch mal so (common practice):
void SetBundesland( const string& n, float e, const string& h )edit: Ok, noch ein paar Worte dazu: Wenn du eine (nicht const-) Referenz als Parameter angibst, erwartet der Compiler natürlich auch bei der Übergabe eine Referenz. Das Literal 1000 ist z.B. aber keine Variable, deshalb gibt es auch keine Referenz auf die Zahl; Referenzen sind übrigens quasi-Zeiger.
const-Referenzen wieconst string&verhalten sich nochmal etwas anders. Natürlich wird auch da eine Referenz erwartet, der Compiler erstellt aber beim Funktionsaufruf mitbl.SetBundesland( "abc", ... );ein temporäres string-Objekt und übergibt eine Referenz auf dieses.Nicht-const-Referenzen benutzt man eigentlich nur, um übergebene Werte auch verändern zu können, a lá
void foo( int& a ) { a += 20; } int main() { int x = 5; foo( x ); cout << x << endl; // Gibt 25 aus foo( 5 ); // Geht nicht, 5 kann nicht verändert werden. }edit2: Und const-Referenzen benutzt man, damit Objekte bei der Übergabe nicht kopiert werden müssen, was aber bei nativen Datentypen wie int, float, double oder Zeigern nicht lohnt, bei string hingegen schon.
-
void SetBundesland(string const& n, float e, string const& h);Oder du rufst die Funktion anders auf:
b[i].SetBundesland(string("Bayern"), 1000, string("Muenchen"));Ich rate aber eher zur ersteren Lösung. Zudem noch ein paar Tipps:
1. <cstdlib> Den Header brauchst du im Code nicht, also unnötig. Zudem sollte man auf die C-Header in C++ eher verzichten. Allerdings hast du zumindest den richtigen C-Header inkludiert.
2. <string> dagegen wird benötigt, inkludierst du aber nicht.
3. Vermeide Abkürzungen! Bei der Funktion, was ist n, e, h? Das sind nichts aussagende Variabelnamen. Völlig unbrauchbar für die Wartung des Codes. Wenn du in einem Jahr den Code nochmals liest, verstehst du nichts mehr.
Auch BL ist völliger Unsinn. Schreib doch besser gleich Bundesland hin. Der Name ist viel mehr aussagekräftig als BL. Bei BL kam mir zum Beispiel als erstes Baselland in den Sinn, da es die Abkürzung dafür ist.
Kurze Namen verwirren, gibt ihnen ruhig genügend Buchstaben. Lieber einen etwas zu langen Namen, als einen zu kurzen!
4. Schenk deinem Code auch etwas mehr Platz und rücke vernünftig ein
Grüssli
-
Vielen Dank für die wertvollen Hinweise und
die konstruktive Kritik.Grüße
Bimbambino