Wie Implementation einer Klasse in dem Hauptprogramm verwenden?
-
Hi zusammen,
ich bin habe Java gelernt und möchte mich ein wenig in C++ einarbeiten. Diesbezüglich bin folgenden Artikel durchgegangen und habe mir ein kleines Testprogramm geschrieben.
Der Link:http://de.wikibooks.org/wiki/C%2B%2B-Programmierung:_Klassen
Die Sum.h:
Mein Code:class Sum { public: // öffentlich Sum(); // der Default-Konstruktor Sum(int a=0); // weiterer Konstruktor mit Parameter und Defaultwert Sum(Sum& a); // Copy-Konstruktor ~Sum(); // der Destruktor int sumMethod(int a, int b); // eine Funktion mit den dazugehörigen Parameter int getErg(); private: // privat int m_erg; };Die Implementation des Codes. Die Sum.cpp:
#include "Sum.h" //Implementation der Methode int Sum::sumMethod(int a, int b) { m_erg = a+b; return m_erg; } int Sum::getErg() { return m_erg; } //Testen der Standardzuweisung des Ergebnisses auf -1 (nicht gesetzt) Sum::Sum() : m_erg(-1) { // weitere Initialisierungen des Objekts } //Copy-Konstruktor: Ergebnis kopieren Sum::Sum(const Sum& a) : m_erg(a.m_erg) { } //Destruktor: Sum::~Sum() { }Mein Hauptgramm.cpp:
#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); }Leider werden mir in meiner IDE einige Fehler angezeigt:
Sum.h:Sum(); // der Default-Konstruktor Sum(int a=0); // weiterer Konstruktor mit Parameter und DefaultwertIm Hauptprogramm.cpp:
call of overloaded `Sum()' is ambiguous `sum' undeclared (first use this function)Meine Fragen:
1.) Hat jemand eine Erklärung dafür, wieso die Konstruktorüberladung nicht funktioniert?
2.) Ich habe in meinem Hauptprogramm.cpp meine Sum-Klasse angegeben. Wie sieht denn die Initialisierung der Sum-Klasse mit dem Defaultkonstruktor und diesem Konstruktor aus: Sum(int a=0);
3.) Geht mein Konzept überhaupt? Also Definition, Implementation und Verwendung einer Klasse?Das sind vielleicht alles für euch triviale Fragen. Dem stimme ich zu. Allerdings finde ich das Klassenkonzept von Java sehr sauber und möchte es, wenn möglich, auch in ähnlicher Form in C++ anwenden.
Über eine Antwort wäre ich sehr dankbar und würde mir den Einstieg in C++ extrem erleichtern.
Vielen Dank im Voraus.
Gruß
-
Fenixx schrieb:
Leider werden mir in meiner IDE einige Fehler angezeigt:
Sum.h:Sum(); // der Default-Konstruktor Sum(int a=0); // weiterer Konstruktor mit Parameter und DefaultwertIm Hauptprogramm.cpp:
call of overloaded `Sum()' is ambiguous `sum' undeclared (first use this function)Was erwartest du denn, welcher Konstruktor bei
Sum s;aufgerufen wird? Der Default-Konstruktor oder der mit Parameter, wo dann der Default-Wert übergeben wird? Wie der Compiler schon meint, der Ausdruck ist mehrdeutig, könnte beides sein und auswürfeln ist nicht. Mach den Defaultwert oder den Default-Konstruktor weg, der Fall "Kein Paramter" darf nur von einem Konstruktor abgedeckt werden.
-
Ich habs mal wie folgt geändert:
#include <iostream> #include "Sum.h" // makes our lives easier... using namespace std; //Sum definieren Sum s(); int main() { int erg = 0; erg = s.sumMethod(2,3); printf("Das Ergebnis %d\n",erg); }mit Sum s(); würde ich nun erwarten, dass der Default-Konstruktor aufgerufen wird.
Nun habe ich nur noch diesen Fehler:
request for member `sumMethod' in `s()', which is of non-aggregate type `Sum ()()Könntest du mir vielleicht die Ursache des Fehlers nahe bringen? Wieso darf die Methode so nicht aufrufen?
-
Das ist eine Funktionsdeklaration. Eine Variablendeklaration mit Standardkonstruktoraufruf sähe so aus:
Sum s;
-
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 { }