Konstruktor wird nicht erkannt



  • Hi,

    um mit der objektorientierten Programmierung anzufangen habe ich mir ein kleines Programm geschrieben, dass allerdings beim Anlegen eines Objektes der Klasse Mensch den Konstruktor nicht findet/aufruft.

    main.cpp

    #include "mensch.h"
    
    int main(){
    
    	{
    		Mensch person(10);
    		//person.printAge( );
    	}
    
    	return 0;
    }
    

    mensch.h

    #ifndef _MENSCH_H_
    #define _MENSCH_H_
    
    #include <iostream>
    #include <cstring>
    using namespace std;
    
    class Mensch{
    	private:
    		unsigned int alter;
    	public:
    		Mensch(int);
    		~Mensch();
    		void printAge();	
    };
    
    void Mensch::printAge(){
    	cout << "\nAlter: " << alter;
    }
    
    Mensch::Mensch(int i){
    	cout << "Objekte angelegt";
    }
    
    Mensch::~Mensch(){
    	cout << "Objekte zerrstört";
    }
    
    #endif
    

    Folgende Fehlermeldung erzeugt der Compiler:

    g++ -Wall -o "main" "main.cpp" (im Verzeichnis: /home/marcel/C++_Programming)
    main.cpp: In function ‘int main()’:
    main.cpp:7: error: no matching function for call to ‘Mensch::Mensch(int)’
    mensch.h:22: note: candidates are: Mensch::Mensch()
    mensch.h:9: note:                 Mensch::Mensch(const Mensch&)
    Kompilierung fehlgeschlagen.
    

    Woran könnte das liegen?



  • Das mensch.h das Du da einbindest, ist nicht das richtige. Es gibt noch ein zweites mensch.h irgendwo im Include-Pfade, und das hat keinen passenden Konstruktor.

    Außerdem:

    • Kein using namespace std in Header-Dateien.
    • Wenn Du die Methoden außerhalb der Klasse aber innerhalb des Headers definierst, sollten diese inline sein, sonst wirst Du schnell die ODR (google) verletzen. Zum Üben ist es aber besser, die Klasse in .h und .cpp aufzuteilen.


  • Danke für die schnelle Antwort.

    Die Deklarationen und Definitionen habe ich eigentlich getrennt in mensch.h und mensch.cpp. Zur Vereinfachung habe ich mal alles in eine Header Datei gepackt.

    Ich habe jetzt alles zu einer Datei zusammengefasst, und damit funktioniert es.
    Nur wenn ich jetzt einen Standardkonstruktor defniere und ein Objekt anlege, bekomme ich 2 verschiedene Ergebnisse.

    #include <iostream>
    #include <cstring>
    using namespace std;
    
    class Mensch{
    	private:
    		unsigned int alter;
    	public:
    		Mensch();
    		~Mensch();
    		void printAge();	
    };
    
    void Mensch::printAge(){
    	cout << "\nAlter: " << alter;
    }
    
    Mensch::Mensch(){
    	cout << "Objekte angelegt\n";
    }
    
    Mensch::~Mensch(){
    	cout << "Objekte zerrstört\n";
    }
    
    int main(){
    
    	{
    		Mensch person();
    		//person.printAge( );
    	}
    
    	return 0;
    }
    

    Lege ich das Objekt mit "Mensch person;" an, wird der Konstruktor aufgerufen.
    Mit "Mensch person();" nicht.

    Wie hängt das zusammen?



  • Was macht denn dein Konstruktor überhaupt?
    Er initialisiert deine Membervariable Alter ja gar nicht.

    Der müsste so aussehen:

    Mensch::Mensch( int age ):
        alter( age )
    {
        cout << "Objekt wurde erfolgreich mit dem Alter " << age << " erstellt!" << endl;
    }
    

    Jetzt initialisierst du deine Membervariable alter auch und zwar über die Elementinitialisierungsliste, so wie man das normal auch machen sollte.

    EDIT:
    Sehe grad dass mein Post erst nach deinem da war.
    Also meine Antwort hatte sich auf deinen ersten Post bezoegen.
    Zu deinem 2. Post, wie mein Nachredner auch schon sagte, du musst auch

    Mensch person;
    

    schreiben, da

    Mensch person();
    

    eine Funktionsdeklaration ist.

    Die Klammer kommt nur bei einem dynamischen Reservieren hin:

    Mensch* p = new Mensch();
    

    Lg freeG



  • Sawyer89 schrieb:

    Lege ich das Objekt mit "Mensch person;" an, wird der Konstruktor aufgerufen.
    Mit "Mensch person();" nicht.

    Mensch person(); ist eine Funktionsdeklaration.



  • Mensch person;
    
    Mensch *person = new Mensch();
    

    in beiden Fällen ist 'person' die Variable und Mensch die Klasse. Der Konstruktor in deiner Klasse heisst ja auch

    Mensch()
    

    also macht

    person()
    

    keinen Sinn (ausser du hast eine Methode deklariert die so heisst)



  • antialias schrieb:

    Der Konstruktor in deiner Klasse heisst ja auch

    Mensch()
    

    also macht

    person()
    

    keinen Sinn (ausser du hast eine Methode deklariert die so heisst)

    Die Begründung ist etwas wirr. Man könnte auch sagen:

    Der Konstruktor in einer anderen Klasse heisst ja auch

    Klasse(int)
    

    also macht

    objekt(32)
    

    keinen Sinn (ausser du hast eine Methode deklariert die so heisst)

    und damit falsch liegen, wenn es um die Deklaration

    Klasse objekt(32);
    

    geht.



  • Selbst dann würde

    Mensch person()
    

    keinen Sinn machen.



  • antialias schrieb:

    Selbst dann würde

    Mensch person()
    

    keinen Sinn machen.

    Nein, du verstehst glaube ich nicht was "Richtigsteller" dir sagen wollte.
    Als Beispiel er hat nen Konstruktor

    Mensch( int )
    

    so dann würde laut deiner Begründung

    Mensch person(4)
    

    auch keinen Sinn geben, was aber natürlich einen Sinn ergibt und vollkommen richtig ist 😉

    Verstehst du?

    Lg freeG


Anmelden zum Antworten