Objekt erstellen



  • Hi,

    ich bin Neuling und habe eine Frage 😕

    Wir sind an einem kleinen Programm, soweit funktioniert auch alles.

    Hier ein Auszug aus der main:
    //Main Datei
    #include <iostream>
    #include "Gas.h"
    #include "datenbank.h"
    using namespace std;
    int main(){
    unsigned int first=0;
    unsigned int waehlen3=0;
    Gas test ("Testgas",6,4); ....

    Funktioniert auch alles soweit.
    Jetzt würden wir gerne eine Datei erstellen (Sie heißt bei uns datenbank.cpp) um dort alle Objekte vom Typ Gas zu erstellen (Also quasi eine extra Datei, in der Objekte erzeugt werden, um die main übersichtlicher zu gestalten.)

    Wenn ich nun dieses Gas test("Testgas",6,4) in die Datenbank.cpp schreibe

    --> Datenbank.cpp

    #include <string>
    #include <iostream>
    #include "datenbank.h"
    #include "Gas.h"
    using namespace std;
    Gas test ("Testgas",3,4); //Warum kann er es jetzt nicht einlesen bzw. versteht es nicht?

    -->Datenbank.h
    #ifndef _DATENBANK_H_
    #define _DATENBANK_H_
    #endif

    Wenn ich nun das Programm kompilieren will kriege ich leider eine Fehlermeldung 😞 Das verstehe ich nicht.

    Nochmal: Das Ziel ist es Objekte zu erzeugen, aber diesen Text nicht in der Main.cpp zu schreiben.

    Vielen Dank für eure Hilfe 🙂



  • Wenn ich nun das Programm kompilieren will kriege ich leider eine Fehlermeldung 😞 Das verstehe ich nicht

    Und deshalb denkst du, dass wir sie auch nicht verstehen? 😉



  • Also ich dachte da eher daran, dass ihr es versteht und ihr mir helfen könnt...



  • Soweit ich weiß ist hier aber keiner ausgebildeter Compiler von Beruf, von daher musst du die Fehlermeldung schon mitliefern.



  • phigo90 schrieb:

    Also ich dachte da eher daran, dass ihr es versteht und ihr mir helfen könnt...

    Das schon... aber es ist einfacher mit Fehlermeldung. Ausserdem könntest du deinen Code noch in die entsprechenden Tags packen, dann ist es für helfende Forumsbesucher noch einfacher deinen Code zu lesen. 🕶

    Edit: Typo korrigiert



  • Welchen Sinn hat Datenbank.h, wenn nichts außer Includeguards drin steht?



  • Und: Zeig mal den Inhalt von Gas.h, denn das ist das interessant... auch Gas.cpp dürfte interessant sein..



  • Okay, danke für die hilfreichen Antworten, aller Anfang ist schwer und das niemand Compiler von Beruf ist, ist mir durchaus klar 😋

    main.cpp

    //Main Datei
    #include <iostream>
    #include "Gas.h"
    #include "datenbank.h"
    using namespace std;
    int main(){
    unsigned int first=0;
    unsigned int waehlen3=0;

    cout << "Was moechten Sie ausfuehren?"<< endl;
    cout << "1:Datenbank einsehen"<<endl;
    cout << "2:Gas erstellen"<<endl;
    cout << "3:Berechnung durchfuehren"<<endl;
    cout << "4:Beenden des Programmes" <<endl;

    while(!(cin>>first) || first<1 || first>4){
    cerr <<"Ihre Eingabe ist fehlerhaft"<<endl;
    cerr << "Geben Sie mit Hilfe einer natuerlichen Zahl an, was sie gerne machen moechten" <<endl;
    cin.clear(); // Falsche Eingabe, er springt in den Fehlermodus, lC6schen mit cin.clear
    cin.ignore(1000,'\n'); //Der Wert von waehlen bleibt noch im Speicher, aber er wird C<berlesen
    }
    switch (first) {
    case 1:
    cout <<"Test"<<endl;
    cout <<"Der cv Wert des ausgewaehlten Gases ist" <<test.get_cv()<<endl;
    break;
    case 2:
    cout <<"Test"<<endl;
    break;
    case 3:
    cout << "Waehlen Sie die Art der Berechnung, welche Sie durchfuehren wollen"<<endl;
    cout << "Fall 1: adiabate reversible Kompression"<<endl;
    cout << "Fall 2: reversible Kompression"<<endl;
    cout << "Fall 3: adiabte Kompression"<<endl;
    cout << "Fall 4: Die Kompression wird mit Waermeleitung sowie Reibung (nicht reversibler Fall) berechnet" <<endl;

    while(!(cin>>waehlen3) || waehlen3<1 || waehlen3>4){
    cerr <<"Ihre Eingabe ist fehlerhaft"<<endl;
    cerr << "Geben Sie mit Hilfe einer natuerlichen Zahl an, mit welchem Rechenfall sie rechnen wollen" <<endl;
    cin.clear(); // Falsche Eingabe, er springt in den Fehlermodus, lC6schen mit cin.clear
    cin.ignore(1000,'\n'); //Der Wert von waehlen bleibt noch im Speicher, aber er wird C<berlesen
    }
    break;
    case 4:
    cout <<"Vielen Dank und bis Bald"<<endl;
    break;
    }

    return 0;
    }

    Gas.cpp

    #include <string>
    #include <iostream>
    #include "Gas.h"
    using namespace std;

    void Gas::set_MM(double GMM){
    MM=GMM;
    }

    void Gas::set_cv(double Gcv){
    cv=Gcv;
    }

    void Gas::set_Name(string GName){
    Name=GName;
    }
    //sollten wir die ganzen get_Methoden nicht als read only machen?
    double Gas::get_MM(){
    return MM;
    }
    double Gas::get_cv(){
    return cv;
    }
    string Gas::get_Name(){
    return Name;
    }
    // Professor macht es anderster, mit Zeiger, was sinnvoller, warum? Folie 100
    Gas::Gas(string GName,double GMM,double Gcv){
    set_MM(GMM);
    set_cv(Gcv);
    set_Name(GName);

    }
    Gas::Gas (double GMM, double Gcv){
    set_MM(GMM);
    set_cv(Gcv);
    set_Name("");

    }

    Gas.h

    #ifndef _GAS_H_
    #define _GAS_H_
    #include <string>

    using namespace std;

    class Gas{

    private:
    string Name;
    double MM;
    double cv;

    public:
    //Konstruktoren definiert
    Gas(string GName,double GMM,double Gcv);
    Gas (double GMM, double Gcv);
    //Destruktor, geht auch in *.cpp aber dann mit Gas::~Gas(){};
    ~Gas(){};

    void set_MM(double GMM);
    void set_cv(double Gcv);
    void set_Name(string GName);
    double get_MM();
    double get_cv();
    string get_Name();
    };

    #endif

    Jetzt ist das Ziel, eine eigene Datei zu schreiben "datenbank.cpp" in der Objekte erzeugt werden können, bisher funktioniert das nur wenn ich mein Testgas:
    Gas test("Testgas,2,3) in die Main.cpp schreibe, sobald der Text in die datenbank.cpp kommt ein Fehler

    Neue Datenbank.cpp

    #include <string>
    #include <iostream>
    #include "datenbank.h"
    #include "Gas.h"
    using namespace std;
    Gas test ("Testgas",3,4); //Warum kann er es jetzt nicht einlesen bzw. versteht es nicht?

    Fehlermeldung:

    In function 'int main()':
    \main_aktuell.cpp [Error] 'test' was not declared in this scope
    \Makefile.win recipe for target 'main_aktuell.o'



  • Bei dieser Zeile ist test unbekannt.

    cout <<"Der cv Wert des ausgewaehlten Gases ist" <<test.get_cv()<<endl;
    

    Du kannst folgendes tun:

    Verschiebe Gas test ("Testgas",3,4); aus Datenbank.cpp ins main.cpp und zwar in die main() -Funktion.

    Edit:
    .. in die main() -Funktion und zwar möglichst nahe an den Ort wo du es benötigst.



  • Ja, das weiß ich bereits, dass dies funktioniert. Ist es nicht möglich in einer Extra Datei die Objekte zu erzeugen, damit die Main übersichtlicher wird.

    Danke für die Hilfe 🙂



  • Thetas Vorschlag ist natürlich der Sinnvollste.
    Trotzdem eben, was da schief geht:

    Wenn du die Fehlermeldung richtig gelesen hättest, dann wäre dir klar, dass nicht die von dir angezeigte Stelle das Problem ist, sondern dass er test nicht findet.
    Wie auch?
    Um das auffindbar zu machen, müsstest du test in datenbank.h deklarien (und inkludieren), damit main weiss, was test ist:

    // datenbank.h
    extern Gas test;
    

Log in to reply