Klasse als Rückgabewert einer Funktion?



  • Hallo Gemeinde,

    ich bin ein blutiger Anfänger und habe folgendes Problem:

    Ich habe eine Klasse Datum deklariert. (int Tag; int Monat; int Jahr; char datumstring)

    Ich möchte jetzt mit einer Funktion aus einem Datum Typ char mit dem Format tt.mm.jjjj die o.g.Klasse erzeugen. Innerhalb der Klasse funzt es auch. Nur die Rückgabe bekomme ich nicht hin.

    Geht das überhaupt eine Klasse als direkte Rückgabe? Wenn nein, wie kann ich das am Geschicktesten anstellen?

    M.f.G.

    Georg



  • class Foo { };
    
    Foo createFoo() { return Foo(); }
    


  • return Datum(Tag,Monat,Jahr,datumstring);
    

    sowas?



  • Ich erzeuge zunächst die Klasse Datum

    class Datum{
    
    public:
    
    	int Tag;
    	int Monat;
    	int Jahr;
    	char Datumstring[15];
    	};
    

    Dann habe ich die Funktion Datumswandel programmiert

    Datum Datumswandel(char datumstring[15]){
    
    Datum datumsklasse;
    
    return datumsklasse;}
    

    Dann rufe ich die Funktion unter main auf

    geburtstag,Datumswandel(datum1);
    

    Nur bekomme ich immer das gleiche Ergebnis für die verwendete Klasse geburtstag.

    Ich hoffe meine ausführungen bringen etwas klarheit in die Angelegenheit.

    M.f.G.

    Georg



  • Hallo,
    es wäre erstmal schön, wenn du beim nächsten mal die C/C++ Code Tags verwenden würdet, die haben das schönere Syntax-Highlighting ;).
    Dann zu deinem Problem: Das ist auch ein bisschen wenig Code. Wobei mir erstmal auffällt, das du da bei deinem unteren Code wahrscheinlich einen Punkt schreiben wolltest. Dann brauchst du noch einen Konstruktor, für deine Klasse, falls du noch keinen hast. Wenn du schon einen hast, sollte der denke ich ungefähr so aussehen.

    (nicht getestet)

    Datum(int t, int m, int j, char ds[15]):Tag(t),Monat(m),Jahr(j),Datumstring(ds) {
    }
    

    und dann kannst du in deiner Methode datumsklasse den Konstruktor so aufrufen:

    (ungetestet)

    Datum Datumswandel(char datumstring[15]){
    
    std::string zwstring(datumsstring);
    int t = atoi(zwstring.substr(0,2).c_str());
    int m = atoi(zwstring.substr(3,2).c_str());
    int j = atoi(zwstring.substr(6,4).c_str());
    Datum datumsklasse(t, m, j, datumstring);
    
    return datumsklasse;}
    

    und oben müsste dann noch

    #include <string>
    

    hin.

    Ich hoffe das funktioniert so. Du solltest im übrigen bei dem datumsstring mit einem std::string arbeiten, die string-Funktionen von C++ sind sehr angenehm.

    MfG

    P.S.: geburtstag ist hier keine Klasse, sondern eine Instanz einer Klasse



  • mit

    geburtstag.Datumswandel(datum1);
    

    willst du warscheinlich erreichen, daß das datum1 in das objekt geburtstag eingetragen wird. das erreichst du nicht mit return, sondern durch das setzten der objektvariablen von geburtstag:

    void Datumswandel (char datumsstring[15])
    {
      strcpy(Datumsstring,datumsstring);
      Tag=...
      Monat=...
      Jahr=...
    }
    

    bei deiner methode mit return-wert müßte es

    Datum neues_datum=geburtstag.Datumswandel(datum1);
    

    heißen.



  • Hallo und vielen Dank für die schnellen Antworten.

    Im Grunde genommen ist das ein Versuch eine Variable einzulesen und dann in einem anderen Format abzuspeichern Es soll daraus ein Program werden welches den Biorhytmus berechnet. Ich weiss das es auch etwas eleganter geht, aber aller anfang ist schwer.

    Ich habe mit meinen bescheidenen Kentnissen das Program wie folgt geschrieben:

    // in diesem Programm möchte ich die Ein - und Ausgabe eines Datums testen. Datum.cpp
    //Datumseingabe als char-Variable und Einlesen der einzelnen Daten in einen Integerwert.
    
    #include <sstream>
    #include <string>
    #include <iostream>
    using namespace std;
    
    //Einführung der Klasse Datum
    class Datum{
    
    public:
    
    	int Tag;
    	int Monat;
    	int Jahr;
    	char Datumstring[15];
    	};
    
    // Funktion Datumswandel
    
    Datum Datumswandel(char datumstring[15]){
    
    Datum datumsklasse;
    int zahl1, zahl2, zahl3, zahl4, zahl5, zahl6, zahl7, zahl8 = 0;
    string tag, tag1, tag2, tag3, tag4, tag5, tag6, tag7, tag8;
    stringstream Str, Str1, Str2, Str3, Str4, Str5, Str6, Str7, Str8;
    
    //Tage auslesen, wandel in int über Streams
    tag1 = datumstring[0]; 
    Str1 << tag1;
    Str1 >> zahl1;
    
    tag2 = datumstring[1];
    Str2 << tag2;
    Str2 >> zahl2;
    
    datumsklasse.Tag = (zahl1 * 10) + zahl2;
    
    //Monat auslesen
    
    tag3 = datumstring[3];
    Str3 << tag3;
    Str3 >> zahl3;
    
    tag4 = datumstring[4];
    Str4 << tag4;
    Str4 >> zahl4;
    
    datumsklasse.Monat = (zahl3 *10) + zahl4;
    
    // Jahr auslesen
    
    tag5 = datumstring[6];
    Str5 << tag5;
    Str5 >> zahl5;
    
    tag6 = datumstring[7];
    Str6 << tag6;
    Str6 >> zahl6;
    
    tag7 = datumstring[8];
    Str7 << tag7;
    Str7 >> zahl7;
    
    tag8 = datumstring[9];
    Str8 << tag8;
    Str8 >> zahl8;
    
    datumsklasse.Jahr = (zahl5 * 1000) + (zahl6 * 100) + (zahl7 * 10) + zahl8;
    
    //Datum als String einlesen
    
    tag = datumstring;
    Str << tag;
    Str >> datumsklasse.Datumstring;
    
    cout<< "\n der Tag lautet: " <<datumsklasse.Tag <<"\n";
    
    cout<< "\n der Monat lautet: " <<datumsklasse.Monat <<"\n";
    
    cout<< "\n das Jahr lautet: " <<datumsklasse.Jahr <<"\n";
    
    cout<< "\n das Datum lautet: " <<datumsklasse.Datumstring <<"\n";
    
    return datumsklasse;
    
    }
    
    int main(){
    
    Datum geburtstag;	//Klasse Geburtstag
    Datum kalendertag;	//Klasse für das Datum
    char datum1[15];		//Geburtstag als string
    char datum2[15];		//Datum als String
    
    cout<<"\nDies ist ein Programm zur Abfrage des Geburtstages!\n";
    
    cout<<"Geben Sie ein Datum ein [tt.mm.jjjj]: ";
    cin>> datum1;
    
    cout<< "\nDer Geburtstag (String) ist der: "<<datum1<<"\n";
    
    geburtstag,Datumswandel(datum1);
    
    cout<< "\n DDie Klasse geburtstag lautet: " <<geburtstag.Tag  <<"\n";
    
    return 0;
    }
    

    Wie gesagt, die Funktion wird aufgerufen und die Ausgaben innerhalb der Funktion signalisieren den richtigen Durchlauf.

    Wenn ich den Aufruf der Funktion über

    geburtstag.Datumswandel(datum1[15];
    

    ausführe erhalte ich beim compilierenfolgende Fehlermeldung:

    Datum.cpp: In function int main()': Datum.cpp:114: error:Datumswandel' undeclared (first use this function)
    Datum.cpp:114: error: (Each undeclared identifier is reported only once for
    each function it appears in.)

    Was nun?

    Gruß Georg



  • georg kappenberg schrieb:

    geburtstag,Datumswandel(datum1);

    Weißt du, was der Kommaoperator tut?

    Wennh den Aufruf der Funktion über

    geburtstag.Datumswandel(datum1[15];
    

    Datumswandel ist keine Memberfunktion der Klasse Datum, darum kannst du sie nicht mit einem Datum-Objekt und dem Punktoperator aufrufen. Wie wäre es denn mit einer einfachen Zuweisung?



  • in der zeile

    geburtstag,Datumswandel(datum1);
    

    hast du einen fehler (obwohl das, so seltsam es klingen mag, korrekter c++-code ist).

    es sollte

    geburtstag=Datumswandel(datum1);
    

    heißen

    aber eigentlich kann ich die fehlermeldung, daß Datumswandel() nicht deklariert sei, nicht nachvollziehen. diese fehlermeldung sollte eigentlich nicht auftreten. bis auf die sache mit dem komma anstelle des gleichheitszeichens funktioniert dein programm einwandfrei.



  • Args, der Code zur Datumsumwandlung ist ja grauenvoll.

    Datum Datumswandel(char dstr[15])
    {
      stringstream str(dstr);
      Datum d;
      char c;
      str>>d.Tag>>c>>d.Monat>>c>>d.Jahr;
      strcpy(d.Datumstring,dstr);
      return d;
    }
    


  • Hallo Konfusius,

    das war es. Es FUNZT!!!! 🙂 Obwohl ich immer noch nicht Weiss weshalb es funzt.

    Hallo CStoll,

    es ist mir klar, das mann den Datumswandler einfacher schreiben kann. Es ist aber mein erstes bescheidenes Program in C++.

    Danke an alle die sich die Mühe gemacht haben die Anfgrage zu lesen und auch zu antworten.

    Gruß Georg 😉



  • georg kappenberg schrieb:

    das war es. Es FUNZT!!!! 🙂 Obwohl ich immer noch nicht Weiss weshalb es funzt.

    Hm, was glaubst Du (so rein logisch gedacht, freier Sprachgebrauch oder Mathe-Unterricht) denn könnte der Unterschied sein zwischen

    geburtstag, Datumswandel(datum1);
    /* Geburtstag, sowie datum1 umgewandelt */
    

    und

    geburtstag = Datumswandel(datum1);
    /* Geburtstag ist gleich datum1 umgewandelt */
    

    😃


Anmelden zum Antworten