Wie Implementation einer Klasse in dem Hauptprogramm verwenden?
-
Das was du da machst, signaliesiert dem Compiler eine Funktionsdeklaration und da s keine Funktion ist, kriegst du diese Fehlermeldung. Nimm wie Badestrand gesagt hat, eine Definition/Deklarations eines deiner Ctors raus, am besten den mit dem Optionalen Parameter.
-
Aber gerade das habe ich ja im ersten Post gemacht:
#include <iostream> #include "Sum.h" // makes our lives easier... using namespace std; //Sum definieren Sum s; int main() { int erg = s.sumMethod(2,3); printf("Das Ergebnis %d\n",erg); }Und trotzdem erhalte ich dann diese Fehlermeldungen... .
-
Der Aufruf ist auch nicht eindeutig. Du hast einen Konstruktor ohne Parameter und einen mit einem Standardparameter. Du musst dich entscheiden, welcher bei der Übergabe von 0 Argumenten aufgerufen werden soll.
-
Sorry, da war ich wohl ein wenig zu spät.
Danke für den Hinweis. Nun habe ich den Code dagehend geändert, dass ich nur noch den Standardkonstruktor zur Verfügung habe und es funktioniert.Eine Frage noch: Kann ich dann gar nicht einen Konstruktor überladen wie in Java?
-
Doch naklar. Aber dein Aufruf im aller ersten Post ist einfach Mehrdeutig. Du hast zum einen einen StandardCtor, und einen dem man einen optionalen Parameter übergeben kann.Und bei deinem Aufruf in der Main weiß der Compiler einfach nicht welchen er nutzen soll, weil beide zutreffen können.
-
Wie meinst du "überladen wie in Java"?
Funktionsüberladung geht natürlich, aber der Aufruf muss trotzdem eindeutig sein.
class MyClass { public: MyClass(); MyClass(int a, float b = 4.2f); MyClass(const std::string& s); };
-
Fenixx schrieb:
Sorry, da war ich wohl ein wenig zu spät.
Danke für den Hinweis. Nun habe ich den Code dagehend geändert, dass ich nur noch den Standardkonstruktor zur Verfügung habe und es funktioniert.Eine Frage noch: Kann ich dann gar nicht einen Konstruktor überladen wie in Java?
Doch kannst du natürlich aber nur dahingehent das die Konsturktoren sich unterscheiden.
Konstruktor() Konstruktur(int a = 0) // Geht nicht das sie sich nicht entsprechend unterscheiden Konstruktor(int a) // Geht da sie sich nicht entsprechenMfg Marco
-
Danke für eure bisherige Hilfe und Geduld.
Mein Code sieht nun so aus:
Sum.h:Sum(); // der Default-Konstruktor Sum(int a); // weiterer Konstruktor mit ParameterSum.cpp:
Sum::Sum(int a) { m_erg = a; }Wenn ich nun weiß, wie ich in meinem Hauptprogramm eine Klasse mit dem Default-Konstruktor und eine mit dem Parameter erzeugen kann, nerve ich euch (vorerst) nicht mehr.

Vorher wars ja so für den DefaultKonstruktor:
Sum s1;Wie siehts nun aus für die Initialisierung einer Klasse mit dem Default-Konstruktor und einer Initialisierung mit einem Parameter?
Gruß
-
StandardCtor wie dein bisheriger also:
Sum s;mit Parameter
int a = 100 Sum s(a);
-
Genau das hab ich so gemacht:
#include <iostream> #include "Sum.h" // makes our lives easier... using namespace std; //Sum definieren Sum s; int main() { int erg = 0; int a = 2; int b = 3; erg = s.sumMethod(a,b); printf("Das Ergebnis %d\n",erg); }Allerdings frage ich mich dann, wieso folgende Fehlermeldung bei mir erscheint:
undefined reference to `Sum::Sum()
-
Wenn du einen StandardCtor deklarierst solltest du den auch definieren hast du das gemacht?
-
Ok, den hatte ich vergessen. Ich bins halt von Java gewohnt, dass der da ist, obwohl ich ihn nicht extra deklarieren brauche.
Vielen Dank für eure Geduld.
-
edit: missverständnis
-
Ne, der Standard-Ctor wird nur erstellt, wenn kein anderer/eigener Ctor deklariert wird.
-
Ahh stimmt...sorry mein Fehler. Ja naklar nur wenn kein andere deklariert ist.
-
Du solltest ausserdem die Initialisierungsliste verwenden.
Brauchst du überhaupt zwei Konstruktoren, reicht ein Defaultparameter nicht?
// Deklaration in der Klasse - Defaultparameter Sum(int a = 0); // Definition ausserhalb Sum::Sum(int a) : m_erg(a) // <-- Initialisierungsliste - mehrere Member durch Komma trennen { }