Methode an Funktion als Argument, in C++

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
Xeon
Beiträge: 156
Registriert: So Dez 17, 2017 4:10 pm

Methode an Funktion als Argument, in C++

Beitrag von Xeon » Mo Okt 10, 2022 12:16 pm

Hallo zusammen

Es geht um folgende Zeile Code:

Kommazahl = meineKlasse->text().nachFloat();

Der Rückgabewert von der Methode text() ist ein String und wird der Funktion nachFloat() als Argument übergeben. Das wundert mich, den ich kann bis jetzt, das ein Argument nur so übergeben wird an eine Funktion
nachFloat(meineKlasse->text()).

Die Frage ist jetzt: Wie kann man sowas selber programmieren, damit man das Argument so übergeben kann:
meineKlasse->text().nachFloat(); ?

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8843
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Methode an Funktion als Argument, in C++

Beitrag von Xin » Mo Okt 10, 2022 12:46 pm

text() muss einen Datentyp liefern, den Du bearbeiten darfst, darf also kein std::string sein. Diese Klassen darf sich natürlich wie ein Standard-String verhalten.

Code: Alles auswählen

class MyString : public std::string   // MyString ist ein std::string und erweitert diesen
{
  public:
    MyString( std::string const & str )
      : std::string( str ) 
   {}

   float nachFloat() const
   {
     return atof( c_str() );
   }  
};
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Xeon
Beiträge: 156
Registriert: So Dez 17, 2017 4:10 pm

Re: Methode an Funktion als Argument, in C++

Beitrag von Xeon » Do Okt 13, 2022 2:08 pm

Soweit bin ich gekommen:

Code: Alles auswählen

#include <iostream>

using namespace std;

class MyString : public std::string
{
  public:
    MyString( std::string const & str )
      : std::string( str )
   {}

   float nachFloat() const
   {
     return atof( c_str() );
   }
};

class MyFloatstring
{
    public:
        const char* text()
        {
            return "3.3";
        }
};

int main()
{
    MyString *myString = new MyString("66.1");
    MyFloatstring *meineKlasse = new MyFloatstring();

    double zahl = 0;
    zahl = meineKlasse->text().nachFloat();

    cout << zahl << endl;

    delete myString;
    delete meineKlasse;

    return 0;
}
Ich bekomme einfach die Fehlermeldung in dieser Zeile nicht weg:

Code: Alles auswählen

zahl = meineKlasse->text().nachFloat();
Gewünscht ist ja, dass der Rückgabewert von text(), an nachFloat() übergeben wird.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8843
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Methode an Funktion als Argument, in C++

Beitrag von Xin » Do Okt 13, 2022 2:21 pm

Xeon hat geschrieben:
Do Okt 13, 2022 2:08 pm
Gewünscht ist ja, dass der Rückgabewert von text(), an nachFloat() übergeben wird.
Dann sollte text() in MeineKlasse einen Datentyp zurückgeben, der nachFloat() kennt. Zum Beispiel MyString. :-)

Ich vermute aber eher, dass Du sowas hier machen willst:

Code: Alles auswählen

int main()
{
    MyString myString("66.1");           // Wenn wir das new lassen, sparen wir uns später das Delete
//    MyFloatstring *meineKlasse = new MyFloatstring();

    float zahl = 0;         // <- hier machen wir ein float statt double draus
    zahl = myString->nachFloat();

    cout << zahl << endl;

//    delete myString;
//    delete meineKlasse;

    return 0;
}
Etwa so?
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Xeon
Beiträge: 156
Registriert: So Dez 17, 2017 4:10 pm

Re: Methode an Funktion als Argument, in C++

Beitrag von Xeon » Do Okt 13, 2022 2:47 pm

Code: Alles auswählen

float zahl = 0;         // <- hier machen wir ein float statt double draus
Ja man könnte ein float daraus machen :D , habe das übersehen.

Nein ich habe das so gemeint wie ich das geschrieben habe am Anfang:
Kommazahl = meineKlasse->text().nachFloat()
meineKlasse->text() liefert eine Zeichenkette die dann nachFloat() als Argument erhält. Ich weiß zwar nicht wie das geht, aber wundern tue ich mich trotzdem.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8843
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Methode an Funktion als Argument, in C++

Beitrag von Xin » Do Okt 13, 2022 2:56 pm

Dann muss "meineKlasse" bei text() eben auch den Datentyp MyString zurückgeben. char const * kann nix.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Xeon
Beiträge: 156
Registriert: So Dez 17, 2017 4:10 pm

Re: Methode an Funktion als Argument, in C++

Beitrag von Xeon » Do Okt 13, 2022 3:26 pm

Xin hat geschrieben:
Do Okt 13, 2022 2:56 pm
Dann muss "meineKlasse" bei text() eben auch den Datentyp MyString zurückgeben. char const * kann nix.
Danke Xin, aber wie erhält jetzt nachFloat() ein Argument? So geht es ja jetzt nicht mehr:

Code: Alles auswählen

class MyFloatstring
{
    public:
        MyString text()
        {
            return "2.33;
        }
};

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8843
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Methode an Funktion als Argument, in C++

Beitrag von Xin » Do Okt 13, 2022 3:29 pm

Xeon hat geschrieben:
Do Okt 13, 2022 3:26 pm
Xin hat geschrieben:
Do Okt 13, 2022 2:56 pm
Dann muss "meineKlasse" bei text() eben auch den Datentyp MyString zurückgeben. char const * kann nix.
Danke Xin, aber wie erhält jetzt nachFloat() ein Argument? So geht es ja jetzt nicht mehr:

Code: Alles auswählen

class MyFloatstring
{
    public:
        MyString text()
        {
            return "2.33;
        }
};
Wenn Du noch ein Anführungszeichen dazu packst, dann geht das genau so.
Moment... Dein MyString braucht noch einen Konstruktor, der den Text weiterleitet:

Code: Alles auswählen

MyString::MyString( char const * text )
  : std::string( text ) {}
Edit 2: Hat er mit std::string ja quasi schon.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Xeon
Beiträge: 156
Registriert: So Dez 17, 2017 4:10 pm

Re: Methode an Funktion als Argument, in C++

Beitrag von Xeon » Fr Okt 14, 2022 12:26 pm

Xin hat geschrieben:
Do Okt 13, 2022 3:29 pm
Xeon hat geschrieben:
Do Okt 13, 2022 3:26 pm
Xin hat geschrieben:
Do Okt 13, 2022 2:56 pm
Dann muss "meineKlasse" bei text() eben auch den Datentyp MyString zurückgeben. char const * kann nix.
Danke Xin, aber wie erhält jetzt nachFloat() ein Argument? So geht es ja jetzt nicht mehr:

Code: Alles auswählen

class MyFloatstring
{
    public:
        MyString text()
        {
            return "2.33;
        }
};
Wenn Du noch ein Anführungszeichen dazu packst, dann geht das genau so.
Oh wie peinlich, habe ich vergessen. :oops:
Xin hat geschrieben:Moment... Dein MyString braucht noch einen Konstruktor, der den Text weiterleitet:

Code: Alles auswählen

MyString::MyString( char const * text )
  : std::string( text ) {}
Edit 2: Hat er mit std::string ja quasi schon.
Vielen Dank Xin, jetzt geht es! Ich stelle den Code nochmal rein, aber diesmal die Variante ohne Zeiger:

Code: Alles auswählen

#include <iostream>

using namespace std;

class MyString : public std::string
{
  public:
    MyString( char const * text )
        : std::string( text ) {}

   float nachFloat() const
   {
     return atof( c_str() );
   }

};

class MyFloatstring
{
    public:
        MyString text()
        {
            return "2.33";
        }
};

int main()
{
    MyString myString("66.1");
    MyFloatstring meineKlasse;

    float zahl = 0;
    zahl = meineKlasse.text().nachFloat();

    cout << zahl << endl;

    return 0;
}

Antworten