Fehler?



  • 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 nicht KFZ::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 😉



  • Wie ich das hasse ... in einem Forum ist es einfach nicht Möglich mal eine schnelle Auskunft zu bekommen..



  • Du musst deine .cpp-Dateien im Projekt/Makefile eintragen.



  • HeikoGrue schrieb:

    Wie ich das hasse ... in einem Forum ist es einfach nicht Möglich mal eine schnelle Auskunft zu bekommen..

    Das Ziel eines Forums ist auch nicht unbedingt eine schnelle Hilfe, gerade nicht von diesem, sondern eine nachhaltige

    Zudem bekommst du nur so gute Antworten, wie deine Fragen dies erlauben. Welche Fehlermeldung kommt nun? Weder sehen wir deinen aktuellen Code noch deine aktuelle Fehlermeldung. Glaubst du eigentlich das wir eine magische Glaskugel haben?

    Lies doch bitte einmal Wichtig: Du brauchst Hilfe? durch. Ins besondere den Punkt "Stell deine Fragen präzise".



  • Wie und Wo mache ich das hab ich ja noch nie gehört bitte für Anfänger



  • Heiko, mit deinem vorvorletzten Beitrag kann ich als potentieller Helfer leider nichts anfangen; denn man weiß nicht, wie der aktuelle Stand ist und was für eine Fehlermeldung woher kommt. Streng dich bitte mal beim Hilfegesuch etwas an. Das schließt auch die Interpunktion ein. Danke.



  • HeikoGrue schrieb:

    Wie und Wo mache ich das hab ich ja noch nie gehört bitte für Anfänger

    Da dies abhängig von den eingesetzten Programmen ist, kann dir hierauf wohl keiner eine eindeutige Antwort geben. Dazu solltest du dich über deine eingesetzte Entwicklungsplattform informieren.



  • OK dann nochmals...

    Aktueller stand.

    Header.cpp

    #ifndef KFZ_H_INCLUDED
    #define KFZ_H_INCLUDED
    
    #include <iostream>
    
    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
    

    KFZ.cpp

    #include <iostream>
    #include "KFZ.h"
    
    using namespace std;
    
    // Konstruktor
    
    KFZ::KFZ(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;
    }
    

    Die Fehlermeldung lautet: undefined reference to KFZ::Show()

    Ich nutze Windows 8 und Codeblocks....



  • Damit kann man schonmal was anfangen.

    In deinem Header (ich vermute mal dass es sich nicth um Header.cpp sondern um KFZ.h handelt) hat der Konstruktor geschweifte Klammern, es handelt sich also um eine Definition, nicht um eine Deklaration! (In der FAQ steht genau, was der Unterschied ist). Der Konstruktor, wie er im Header definiert wurde, macht allerdings nicht viel - genauer gesagt garnichts.

    KFZ.cpp scheint in deinem Projekt garnicht mit eingebunden zu werden. Der Compiler/Linker findet beim Übersetzen den Konstruktor aus dem Header (nicht den aus der KFZ.cpp). Die Methode Show() findet er nicht.
    Würdest du KFZ.cpp bei dem aktuellen Stand in das Projekt mit reinbinden, bekämst du zwar den Fehler wegen der fehlenden Referenz nicht, stattdessen aber einen Fehler, weil du zweimal einen Konstruktor definiert hast (einmal im Header, einmal in der KFZ.cpp).

    Die Lösung ist also zweiteilig:

    1. Binde die KFZ.cpp in dein Projekt mit ein.
    2. Entferne die geschweiften Klammern beim Konstruktor in KFZ.h

    und dann alles nochmal übersetzen.



  • Zwei Dinge:

    (1) Das Klammernpaar {} innerhalb der Klassendefinition hinter dem Konstruktor muss weg. Du willst das Ding da ja nur deklarieren, nicht definieren.

    (2) Wie ich bereits schon fragte: Bist du dir sicher, dass KFZ.cpp überhaupt kompiliert wird und dessen Kompilat mitgebunden wird? Wenn Du nicht weißt, was ein Linker ist, solltest du das mal recherchieren.

    Edit: Da war einer schneller 😉



  • Ich kenne CodeBlocks nicht, aber ich gehe mal davon aus, das du auch dort über die Oberfläche Projekte anlegen und diesem dann die Dateien hinzufügen kannst. Der Compiler kennt deine cpp-Datei nicht automatisch durch ein Include. Es gibt eine Projektdatei (wenn man mit einer IDE arbeitet, editiert man diese aber selten per Hand) in der alle Dateien des Projektes bekannt gegeben werden, damit der Compiler/Linker weiß welche er verwenden soll.



  • *Die Lösung ist also zweiteilig:

    1. Binde die KFZ.cpp in dein Projekt mit ein.
    2. Entferne die geschweiften Klammern beim Konstruktor in KFZ.h*

    Zu 1) Wieso ist diese nicht durch die #include "KFZ.h" eingebunden?

    Mein Projekt besteht aus KFZ.h KFZ.cpp und main.cpp

    den Grund das er diese nicht findet kann ich also garnicht verstehen.

    1. Diese Klammern habe ich bereits entfernt.

    Bzgl dem Konstruktor hab ich jetzt auch schon in vielen Tutorials gesehen das der schon so aussehen kann ... wie wäre diese den richtig=?



  • Wo ist denn der Facepalm-Smiley? Warum ignorierst du meine Posts?
    Hättest du meine (unsere) Tipps beachtet, hättest du auf die Lösung schon vor 20 Posts selber kommen können.



  • das ist echt zum ausrasten hier

    ich habe nun mit #include "KFZ.cpp"

    diese auch in der main inkludiert.. nun gibt's die Fehlermeldung:

    error: Verbrauch10Km was not declared in this scope...

    wieso das bitte mit den andern variablen hat er ja auch keine Probleme.



  • Danke erstmals [Rewind] dennoch funktoniert das noch nicht so ganz bei mir.

    gr.heiko@googlemail.com könntest du mir evtl mal deine Kontaktdaten geben?

    hätte einen Auftrag für dich.



  • Heiko, sei geduldig und beharrlich. Alles ist am Anfang schwierig. Beherzige nur die Tipps, die du hier bekommst, und irgendwann macht's Klick.
    Ich biete gerne Hilfe zur Selbsthilfe an, nehme aber keine Aufträge an.


Anmelden zum Antworten