Fehler?
-
was ist da der Fehler mit KFZ Audi; wird ein objekt erzeugt und mit Audi.Show(); führe ich es in der Show Methode aus oder
-
-
daddy_felix schrieb:
* Welchen Sinn hat die Methode "erzeugen"?
* Wofür dient ein Konstruktor?
Er hat ja geschrieben, dass er die Funktion nur zu Debugging-Zwecken erstellt hat. Vorher war's mit einem Konstruktor.
Edit: ich versuch's nochmal: Audi.Show
()
-
Oben siehst man den Konstruktor der ist auskommentiert.
Diese füllt die einzelnen Attribute.
und Show Methode gibt das Auto dann aus.
benötige nur kurze hilfe was da den falsch ist.
-
NOCHMAL
main
#include <iostream>
#include "KFZ.h"using namespace std;
int main()
{
KFZ::KFZ Audi(50,8.7,3.4,5.4,1.0);Audi.Show;
return 0;
}Header
#ifndef KFZ_H_INCLUDED
#define KFZ_H_INCLUDED#include <iostream>
using namespace std;
class KFZ
{
public:// Konstruktor
KFZ(int nTankgr,double nVerbrauch100Km,double nTankinhalt,double nKmStand,double nGewicht){};
// Alles Zeigen
void Show();
private:
int Tankgr;
double Verbrauch100Km;
double Tankinhalt;
double KmStand;
double Gewicht;};
#endif // KFZ_H_INCLUDED
So mit dem Konstruktor.. das ist ja eigendlich kein Hexenwerk. Bin in c++ neu in Java denke würde ich mir nicht soo schwer tun^^
Wo könnte den der Fehler liegen bzw kann mir jemand das verbessern und mir erklären?
-
Da ist das nicht wirklich anders, also auf dem Wissenslevel der Objektorientierung.
Und du allen (auch dir) den Gefallen und setzt deinen Code in Code Tags, die Digner utner dem Beitrag schreiben Fenster (wo C++ dransteht)
-
Wie von Rewind schon mehrmals angedeutet, mußt du bei einer Funktion die () mitschreiben.
Also Audi.show();
-
Das habe ich habe wohl das falsche gepostet.
-
Funktioniert nicht habe ich ja bereits
-
"Geht nicht" gibst nicht, jedenfalls nicht ohne Fehlerbeschreibung
-
Dann poste doch mal bitte den richtigen Code, und zwar in C++-Tags.
-
Die neue Fehlermeldung ist dann aber undefined reference to KFZ::Show()
-
Header
#ifndef KFZ_H_INCLUDED #define KFZ_H_INCLUDED #include <iostream> using namespace std; class KFZ { public: // Konstruktor KFZ(int nTankgr,double nVerbrauch100Km,double nTankinhalt,double nKmStand,double nGewicht){}; //void erzeugen (int nTankgr,double nVerbrauch100Km,double nTankinhalt,double nKmStand,double nGewicht){}; // Alles Zeigen void Show(); private: int Tankgr; double Verbrauch100Km; double Tankinhalt; double KmStand; double Gewicht; }; #endif // KFZ_H_INCLUDEDKFZ.cpp
#include <iostream> #include "KFZ.h" using namespace std; } // Konstruktor void KFZ::erzeugen(int nTankgr,double nVerbrauch100Km,double nTankinhalt,double nKmStand,double nGewicht) { Tankgr = nTankgr; Vebrauch100Km = nVerbrauch100Km; Tankinhalt = nTankinhalt; KmStand = nKmStand; Gewicht = nGewicht; } //Show Funktion void KFZ::Show() { cout<< "Tankgroeße : "<< Tankgr <<endl; cout<< "Verbrauch auf 100 Km : "<< Verbrauch100Km <<endl; cout<< "Tankinhalt zurzeit : "<< Tankinhalt <<endl; cout<< "Aktueller Km Stand : "<< KmStand <<endl; cout<< "Zulässiges Gewicht : "<< Gewicht <<endl; }Main.cpp
#include <iostream> #include "KFZ.h" using namespace std; int main() { KFZ::KFZ Audi(50,8.7,3.4,5.4,1.0); Audi.Show(); return 0; }
-
eddi0815 schrieb:
Also Audi.show();
Zu den Klammern sagt man auch manchmal "function call operator".

HeikoGrue schrieb:
Die neue Fehlermeldung ist dann aber undefined reference to KFZ::Show()
Dann hast du die "one definition rule" nicht beachtet. (Mal so am Rande: Das ist eine Fehlermeldung des Linkers und nicht des Compilers.)
Edit:
- using namespace std; hat in Header-Dateien nichts zu suchen! Jedenfalls nicht auf dieser Namensraumebene!
- Dein Konstruktor ist Käse. Der nimmt alle möglichen Parameter entgegen und tut gar nichts!
- Du definierst in KFZ.cpp eine Funktion, die es laut Klassendefinition gar nicht gibt (erzeugen)
- in KFZ.cpp steht ein verlorenes }Kompilierst du KFZ.cpp auch und linkst die resultierende Objektdatei dazu?
-
und das bedeutet für mich=?
-
Edit:
- using namespace std; hat in Header-Dateien nichts zu suchen! Jedenfalls nicht auf dieser Namensraumebene!wieso nicht? diese wird in den Unterklassen inkludiert... und somit ist es in den andern Klassen auch oder.
Aber habe es weg.
- Dein Konstruktor ist Käse. Der nimmt alle möglichen Parameter entgegen und tut gar nichts!
ein Default Kontstruktor gibt den Attributen den wert 0 dieser hier füllt die werte oder nicht=?
- Du definierst in KFZ.cpp eine Funktion, die es laut Klassendefinition gar nicht gibt (erzeugen)
erzeugen ist bereits rausgenommen.
- in KFZ.cpp steht ein verlorenes }
gefunden und beseitigt.
Kompilierst du KFZ.cpp auch und linkst die resultierende Objektdatei dazu?
===??????
Fehlermeldung bleibt.
-
HeikoGrue schrieb:
und das bedeutet für mich=?
- using namespace ganz weglassen und überall std:: schreiben (wo es nötig ist) oder nur in Funktionen verwenden, und zwar so stark wie möglich eingeschränkt (soll heißen:
using namespace std::cout;)
- Initialisiere die Member mit der Initialisierungsliste im Konstruktor (s. Google)void erzeugen ()in der Klassendefinition deklarieren
- die geschweifte Klammer wegmachen#include <iostream>in main.cpp und KFZ.cpp löschen
- Das Objekt so erstellen:KFZ Audi...und nichtKFZ::KFZ Audi....
- Alle Kapiteln bis zu dem über Klassen nochmal lesen.
-
HeikoGrue schrieb:
und das bedeutet für mich=?
Alan Perlis schrieb:
11: If you have a procedure with 10 parameters, you probably missed some.
Quelle neben einem von Herb Sutters Büchern
HeikoGrue schrieb:
Edit:
- using namespace std; hat in Header-Dateien nichts zu suchen! Jedenfalls nicht auf dieser Namensraumebene!wieso nicht? diese wird in den Unterklassen inkludiert... und somit ist es in den andern Klassen auch oder.
Und genau damit hebelst du ja das gesamte Namespace-System aus. Denk mald rüber nach wofür die gut sind.
HeikoGrue schrieb:
- Dein Konstruktor ist Käse. Der nimmt alle möglichen Parameter entgegen und tut gar nichts!
ein Default Kontstruktor gibt den Attributen den wert 0 dieser hier füllt die werte oder nicht=?
Nein, das musst du auch explizit machen (auch mit ein Grund warum C++ so schnell ist), in deinen Variablen steht nur Müll drin.
HeikoGrue schrieb:
Kompilierst du KFZ.cpp auch und linkst die resultierende Objektdatei dazu?
===??????
Fehlermeldung bleibt.
Das ist der Vorgang beim Starten von C++ Code. Die Sourcedateien werden compiliert(übersetzt), da du aber viele Source Dateien haben kannst, muss danach nochd er Linker drüberschauen und diese zu einem Programm zusammenfügen.
-
Mh so ganz verstehe ich das nun leider nicht liegt die Fehlermeldung nun am Konstruktor.. wer kann mir den mal eine verbesserung liefern=?
wäre super nett
-
HeikoGrue schrieb:
wer kann mir den mal eine verbesserung liefern=?
Das kannst du selbst, indem du rausfindest was die Fehlermeldung bedeutet. Und dafür gibts einen Eintrag in der FAQ
