Hilfe! Übergabe eines Wertes von main.cpp in class [Problem GELÖST]



  • Hallo,
    Ich habe das Problem, dass ein eingelesener Wert in der main.cpp in eine class übergeben werden soll.
    Ich habe alles soweit Programmiert und bekomme eine Fehlermeldung.
    Jedoch kann ich mit der Meldung nichts anfangen. Soll heisen ich weiss nicht was ich anders machen muss damit der Fehler behoben ist.

    #include <iostream>
    #include "Minuten.h"
    #include <windows.h>
    
    using namespace std;
    
    int main()
    {
        double Z;
        int Zeitsumme=0;
        Minuten Zeit;
       double Zeitspanne;
    
      do
      {
          cout << "Gebe ganzzahlige Zeitspanne ein: ";
          cin >> Z;                                              //einlesen der Zeitspanne in "Z"
          Minuten* pZeitspanne;                                 // Zeiger definieren
          pZeitspanne = new Minuten (Z);                           // erzeugt neues Objekt
          cout << endl;
    
            Zeit.Ausgabe();
    
      } while (Z > 0);
    
      system ("pause");
        return 0;
    }
    

    //In main.cpp line 20: error: no matching function for call to 'Minuten::Minuten(double&)'

    #include "Minuten.h"
    #include <iostream>
    
    using namespace std;
    
    Minuten::Minuten(double Zeitpanne)
    {
        Z=Zeitspanne;
    }
    
    //Minuten::~Minuten()
    //{
        //dtor
    //}
    
    int Minuten::berechneStunden()
    {
    
        Std=(Zeitspanne/60);              //Anzahl Stunden in Dezimal
        Stunden=static_cast<int>(Std);    //Anzahl Stunden als int-Wert d.h. OHNE Nachkommastelle
         return 0;
    }
    
    int Minuten::berechneMinuten()
    {
        MinutenBerechnung=(Std-Stunden)*60;       
        return 0;
    }
    
    void Minuten::Ausgabe()
    {
        this->berechneStunden();
        this->berechneMinuten();
        cout << "Die angegebene Zeitspanne entspricht "<< Stunden << " Stunden und " << MinutenBerechnung << " Minuten" << endl;
    
    }
    
    #ifndef MINUTEN_H
    #define MINUTEN_H
    using namespace std;
    
    class Minuten
    {
        public:
    
        Minuten();
        int berechneStunden();
        int berechneMinuten();
        void Ausgabe();
        double Std;
        int MinutenBerechnung;
        int Stunden;
        double Zeitspanne;
        double Z;
    
    };
    
    #endif // MINUTEN_H
    

    Ich danke schon einmal im voraus.



  • In deiner Minuten.h muss der Konstruktur natürlich die gleichen Parameter haben wie auch in deiner Minuten.cpp Datei.



  • Jetzt nach der Änderung, wie ich den Tipp verstanden habe kommt eine ähnliche Fehlermeldung in Line 11.
    Tut mir leid wenn ein paar von euch die Hände über den Kopf zusammenschlagen aber ich bin blutiger anfänger und noch dabei C++ zu verstehen. 😕

    #include <iostream>
    #include "Minuten.h"
    #include <windows.h>
    
    using namespace std;
    
    int main()
    {
        double Z;
        int Zeitsumme=0;
        Minuten Zeit;
       double Zeitspanne;
    
      do
      {
          cout << "Gebe ganzzahlige Zeitspanne ein: ";
          cin >> Z;                                              //einlesen der Zeitspanne in "Z"
          Minuten* pZeitspanne;                                 // Zeiger definieren
          pZeitspanne = new Minuten (Z);                           // erzeugt neues Objekt
          cout << endl;
    
            Zeit.Ausgabe();
    
      } while (Z > 0);
    
      system ("pause");
        return 0;
    }
    

    //In main.cpp line 11: error: no matching function for call to 'Minuten::Minuten'

    #include "Minuten.h"
    #include <iostream>
    
    using namespace std;
    
    Minuten::Minuten(double Zeitpanne)
    {
        Z=Zeitspanne;
    }
    
    //Minuten::~Minuten()
    //{
        //dtor
    //}
    
    int Minuten::berechneStunden()
    {
    
        Std=(Zeitspanne/60);              //Anzahl Stunden in Dezimal
        Stunden=static_cast<int>(Std);    //Anzahl Stunden als int-Wert d.h. OHNE Nachkommastelle
         return 0;
    }
    
    int Minuten::berechneMinuten()
    {
        MinutenBerechnung=(Std-Stunden)*60;       
        return 0;
    }
    
    void Minuten::Ausgabe()
    {
        this->berechneStunden();
        this->berechneMinuten();
        cout << "Die angegebene Zeitspanne entspricht "<< Stunden << " Stunden und " << MinutenBerechnung << " Minuten" << endl;
    
    }
    
    #ifndef MINUTEN_H
    #define MINUTEN_H
    using namespace std;
    
    class Minuten
    {
        public:
    
         Minuten(double Z, double Zeitspanne);  //meine änderung zum vorherigen
        int berechneStunden();
        int berechneMinuten();
        void Ausgabe();
        double Std;
        int MinutenBerechnung;
        int Stunden;
        double Zeitspanne;
        double Z;
    
    };
    
    #endif // MINUTEN_H
    

    Ich danke schon einmal im voraus.



  • Das entspricht ja auch noch immer nicht dem was in deiner cpp Datei steht. Dort hast du: Minuten(double Zeitpanne) . Also muss auch eine Funktion mit den gleichen Parametern in deiner Header Datei auftauchen.



  • Das hab ich verstanden.

    //.h - File
    Minuten (double Zeitspanne);
    
    //Minuten.cpp - File
    Minuten::Minuten(double Zeitspanne)
    {
     Z=Zeitspanne
    }
    

    Dennoch bekomme ich den Fehler in Line 11 angezeigt.

    Falls es das immer noch nicht ist was du meinst, wäre es super wenn du die 3 Zeilen in korrekter weise mal schreiben könntest.

    Danke 🙂



  • Was willst du da eigentlich machen?
    Warum gibt es Zeit und pZeitspanne? pZeitspanne wird nie wirklich benutzt.

    Der Fehlermeldung im aktuellen Code kommt von Zeit, da du keinen Konstruktor mehr hast, der ohne eine Parameter auskommt.



  • Das ist eine Aufgabenstellung:

    Schreiben Sie ein Programm, das solange Minutenwerte einliest bis es keine valide
    Ganzzahl bekommt. Das Programm soll die Minuntenwerte in Stunden und Minuten
    umrechnen und formatieren. Bevor das Programm beendet, soll die Gesamtdauer aller
    Eingaben in Minuten angezeigt werden.

    Schreiben Sie ein Hauptprogramm, das in einer Endlosschleife solange Werte
    einliest bis keine gültige Ganzzahl mehr eingeben wird. Für jeden eingelesenen
    Wert soll ein neues Minuten-Objekt auf dem Heap erzeugt werden. Die
    Ausgabe erfolgt über den Aufruf ausgabe(). Zusätzlich soll jeder eingelesene
    Minutenwert einer Gesamtvariablen aufaddiert werden und beim Beenden des
    Programms ausgegeben werden. Denken Sie auch daran den reservierten Speicher
    wieder freizugeben.

    (Das dass nicht mit Heap gelöst werden muss weiss ich.)

    manni66 schrieb:

    Was willst du da eigentlich machen?
    Warum gibt es Zeit und pZeitspanne? pZeitspanne wird nie wirklich benutzt.

    Um den new-Operator zu verwenden benötige ich doch einen Zeiger, oder?



  • TiGei schrieb:

    manni66 schrieb:

    Was willst du da eigentlich machen?
    Warum gibt es Zeit und pZeitspanne? pZeitspanne wird nie wirklich benutzt.

    Um den new-Operator zu verwenden benötige ich doch einen Zeiger, oder?

    Nein, um das mit new erzeugte zu verwenden brauchst du einen Zeiger. Dann fehlt aber so etwas wie

    pZeitspanne->ausgabe();

    So wie du es machst wird einfach ein Objekt erzeugt und dann vergessen (du hast auch nicht daran gedacht, den reservierten Speicherplatz wieder freizugeben).



  • #include <iostream>
    #include "Minuten.h"
    #include <windows.h>
    
    using namespace std;
    
    int main()
    {
        double Z;
        int Zeitsumme=0;
       // Minuten Zeit;
        double Zeitspanne;
    
      do
      {
          cout << "Gebe ganzzahlige Zeitspanne ein: ";
          cin >> Z;                                              //einlesen der Zeitspanne in "Z"
          Minuten* pZeitspanne;                                 // Zeiger definieren
          pZeitspanne = new Minuten (Z);                        // erzeugt neues Objekt
          cout << endl;
    
           pZeitspanne -> Ausgabe();
    
        delete pZeitspanne;
    
      } while (Z > 0);
    
      system ("pause");
        return 0;
    }
    

    Ich habe die Anmerkungen mal umgesetzt.

    #include "Minuten.h"
    #include <iostream>
    
    using namespace std;
    
    Minuten::Minuten(double Z)
    {
        Z=Zeitspanne;
    }
    
    //Minuten::~Minuten()
    //{
        //dtor
    //}
    
    int Minuten::berechneStunden()
    {
    
        Std=(Zeitspanne/60);              //Anzahl Stunden in Dezimal
        Stunden=static_cast<int>(Std);    //Anzahl Stunden als int-Wert d.h. OHNE Nachkommastelle
         return 0;
    }
    
    int Minuten::berechneMinuten()
    {
        minuten=(Std-Stunden)*60;       //return - Wert benötigt?
        return 0;
    }
    
    void Minuten::Ausgabe()
    {
        this->berechneStunden();
        this->berechneMinuten();
        cout << "Die angegebene Zeitspanne entspricht "<< Stunden << " Stunden und " << minuten << " Minuten" << endl;
    
    }
    
    #ifndef MINUTEN_H
    #define MINUTEN_H
    using namespace std;
    
    class Minuten
    {
        public:
    
        Minuten(double Z);
        int berechneStunden();
        int berechneMinuten();
        void Ausgabe();
        double Std;
        int minuten;
        int Stunden;
        double Zeitspanne;
        //double Z;
    
    };
    
    #endif // MINUTEN_H
    

    Jetzt habe ich keine Fehlermeldung mehr. Aber bei der Ausführung des Programms werden die Methoden nicht durchgeführt. Also denke ich mir mal das der eingelesene Wert immer noch nicht übergeben wurde.



  • Die Reihenfolge der Zuweisung ist falsch herum:

    Minuten::Minuten(double Z)
    {
        Z=Zeitspanne;
    }
    

    Hier ist Z ja dein Parameter und Zeitspanne ist die Membervariable.



  • Super es klappt.
    Mir war auch nicht klar das es eine Reihenfolge gibt.
    Vielen Dank für eure Hilfe. 👍 😃


Anmelden zum Antworten