Includes und aufsplitten in .cpp und .h



  • Wie schon gesagt : Es geht hier vor allem darum, die Includes richtig zu setzen / verstehen.
    Mit der Konstellation oben bekomme ich den Error (in Multiplikation.h)

    line 9: error: expected class-name before '{' token
    

    Daraus folgen dann die Fehler :

    line 11: error: 'Zahl' does not name a type
    line 12: error: 'Zahl' does not name a type
    line 13: error: 'Zahl' does not name a type
    line 15: error: expected ')' before '*' token
    


  • Hattest du meinen Beitrag vom 13:16:01 14.06.2016 überhaupt gelesen?

    Und wenn ja (du hattest den "Tippfehler" ja angeblich berichtigt): wie sieht deine Zeile 9 jetzt aus? (auch das hatte ich schon einmal gefragt)



  • Ah, irgendwie ist da der Fehler mit dem :: inzwischen scheinbar behoben. Mir fallen noch alle möglichen anderne Dinge auf:

    1. Bitte niemals "using namespace ..." innerhalb eines Headers nutzen.
    2. Ich hatte es schon angemerkt, dass du in Addition und Multiplikation die Zahlen nicht speichern sollst - und nun, nachdem ich das UML sehe, bestätigt sich das. Auch in diesem UML wird diese Doppelspeicherung nicht vorgenommen. Dafür sind doch extra getOperand1 und 2 da!

    Eigentlicher Fehler: es sind so viele Dateien, die copy-paste ich jetzt nicht alle einzeln, um den Fehler zu reproduzieren, sorry. Vielleicht hast du irgendwo ein Include vergessen? Und ist

    line 9: error: expected class-name before '{' token

    wirklich der vollständige Fehler? Gibt es nicht vielleicht ein paar Zeilen davor/danach, die mehr Aufschluss geben?



  • Vielen Dank für deine Hilfe.

    Ja ich hatte den Beitrag gelesen, und der Fehler blieb derselbe, da der Fehler sich auf die Multiplikation.h bezogen hat, und nicht auf die verbesserte Multiplikation.cpp.

    Zu 1: Danke, das hatte ich bisher noch nicht gewusst.
    Liegt das daran, dass man die Std Lib in headern nicht braucht, wenn man zugehörige .cpp Dateien hat ?

    Zu 2: D.h. ich übergebe die direkt an BinaerOperation, richtig ?

    Zu 3: In meinem letzten Post habe ich alle 5 resultierenden Fehler gepostet. Außer dem von dir genannten sind das noch 4 weitere.

    Falls es hilft (und um das Copy-Paste zu umgehen, sind hier alle Dateien als Download).

    https://drive.google.com/file/d/0B8p3-t4oD8EidUpIUmdmVnhJSE0/view?usp=sharing

    Nochmals danke !



  • Was sollen die include in Zahl.h?
    Was soll die Definition der static member im Zahl.h?



  • 1: Eine Zahl muss von Addition, Multiplikation und BinaereOperation neue Objekte erstellen. Außerdem wird auch ein static Programm angelegt. Deswegen hab ich diese Header includet. War das falsch ?

    2: Ich geh davon aus, dass man das in der .cpp macht. Ich hab bisher aber nur Header für Klassen verwendet und kenn mich deswegen da noch nicht so ganz aus. Danke für den Tipp.



  • jasperjodler schrieb:

    1: Eine Zahl muss von Addition, Multiplikation und BinaereOperation neue Objekte erstellen.

    Blödsinn. Eine Zahl ist eine Zahl, die muss nicht wissen, ob sie multipliziert werden kann. Umgekehrt: die Multiplikation oder Addition muss natürlich die Zahl kennen!

    Also alle deine Header kannst du aus Zahl.h rauswerfen!

    Im Multiplikation.h verwendest du dagegen die Klasse Zahl. Damit das geht, muss sie bekannt sein. Also include darin die Zahl.h. Oder, da du nur Zahl* verwendest, sag einfach am Anfang des Headers mit "class Zahl;" bescheid, dass Zahl eine Klasse ist.

    Dann wäre es noch nett zu wissen, wie du kompilierst (wie lautet deine Kommandozeile oder hast du ein Makefile?). Mit g++ -std=c++11 -Wall -Wextra ... bekomme ich doch sehr viele Warnungen und auch Fehler.



  • jasperjodler schrieb:

    1: Eine Zahl muss von Addition, Multiplikation und BinaereOperation neue Objekte erstellen.

    Zeige mir eine Zeile im Header, in der das vorkommt.

    Außerdem wird auch ein static Programm angelegt. Deswegen hab ich diese Header includet.

    Dafür reicht das vorhandene class Programm aus.

    Dein Problem sind höchstwahrscheinlich zyklische include, und in Zahl legst du die Grundlagen dafür.



  • So, jetzt habe ich alle Header aus Zahl.h rausgeworfen. Dann bekomme ich die Fehlermeldung :

    In member function 'Zahl Zahl::operator+(Zahl&) const':
    
    Zahl.cpp |39| error: 'Operation' was not declared in this scope|
    Zahl.cpp |39| error: 'add' was not declared in this scope|
    Zahl.cpp |39| error: expected type-specifier before 'Addition'|
    Zahl.cpp |40| error: invalid use of incomplete type 'class Programm'|
    Zahl.h   |7 | error: forward declaration of 'class Programm'|
    
    In member function 'Zahl Zahl::operator*(Zahl&) const':
    
    Zahl.cpp |51| error: 'Operation' was not declared in this scope|
    Zahl.cpp |51| error: 'mul' was not declared in this scope|
    Zahl.cpp |51| error: expected type-specifier before 'Multiplikation'|
    Zahl.cpp |52| error: invalid use of incomplete type 'class Programm'
    Zahl.h   |7 | error: forward declaration of 'class Programm'
    

    Das habe ich aber eigentlich auch erwartet, da ich ja die include Multiplikation und Addition rausgelöscht habe.

    Hier nochmal der relevante Code mit Zeilenangaben:
    Zahl.h

    #pragma once
    #include <sstream>
    #include <iostream>
    
    using namespace std;
    
    class Programm;
    
    class Zahl
    {
    private:
        float wert;
    
    public:
        static Programm* programm;
        static bool rec;
        friend Zahl* const ergebnis();
        Zahl(float wert = 0);
        Zahl(const Zahl& z);
        float getwert() const;
        void operator=(const float& f);
        void operator=(const Zahl& z);
        Zahl operator+(Zahl& z) const;
        Zahl operator*(Zahl& z) const;
        static void operationenAufzeichnen(Programm* p);
    };
    

    Zahl.cpp

    #include <sstream>
    #include <iostream>
    
    #include "Zahl.h"
    
    using namespace std;
    
    Zahl::Zahl(float wert)
    {
        this -> wert = wert;
    }
    
    Zahl::Zahl(const Zahl& z)
    {
        this -> wert = z.wert;
    }
    
    float Zahl::getwert() const
    {
        return wert;
    }
    
    void Zahl::operator=(const float& f)
    {
        wert = f;
    }
    
    void Zahl::operator=(const Zahl& z)
    {
        wert = z.getwert();
    }
    
    Zahl Zahl::operator+(Zahl& z) const
    {
        Zahl summe;
        summe.wert = wert + z.getwert();
        if(rec)
        {
            Operation* add = new Addition(this, this, &z);
            programm->hinzufuegen(add);
        }
        return summe;
    }
    
    Zahl Zahl::operator*(Zahl& z) const
    {
        Zahl produkt;
        produkt.wert = wert * z.getwert();
        if(rec)
        {
            Operation* mul = new Multiplikation(&produkt, this, &z);
            programm->hinzufuegen(mul);
        }
        return produkt;
    }
    
    void Zahl::operationenAufzeichnen(Programm* p)
    {
    	programm = p;
    	if(p != nullptr)
    		rec = true;
    }
    
    bool Zahl::rec = false;
    Programm* Zahl::programm;
    

    Meine Kommandozeilenargumente sind :

    g++ -std=c++11 -Wall
    


  • Die Fehlermeldung ist in deiner cpp-Datei. Dort musst du die entsprechenden Header natürlich includen!



  • Danke Leute für eure Hilfe !

    Jetzt funktioniert alles. Ich hab noch das Programm und die ausfuehren()- Funktionen fertig geschrieben, und jetzt kann das Programm die Rechnungen nachstellen.

    Vielen Dank.


Anmelden zum Antworten