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"; } #endifFolgende 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.hdas Du da einbindest, ist nicht das richtige. Es gibt noch ein zweitesmensch.hirgendwo im Include-Pfade, und das hat keinen passenden Konstruktor.Außerdem:
- Kein
using namespace stdin Header-Dateien. - Wenn Du die Methoden außerhalb der Klasse aber innerhalb des Headers definierst, sollten diese
inlinesein, sonst wirst Du schnell die ODR (google) verletzen. Zum Üben ist es aber besser, die Klasse in.hund.cppaufzuteilen.
- Kein
-
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 auchMensch 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 KonstruktorMensch( 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