Wie Implementation einer Klasse in dem Hauptprogramm verwenden?



  • 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 entsprechen
    

    Mfg 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 Parameter
    

    Sum.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
    {
    
    }
    

Anmelden zum Antworten