Struktur als Rückgabewert einer Methode



  • Hallo!

    ICh bin noch relativ neu auf dem Gebiet C++ und beschäftige mich gerade mit dem Thema OOP. Dabei bin ich auf folgendes Problem gestoßen.

    Ich habe zB. eine Klasse Mensch mit den privaten Variablen: Name, Alter, Größe.

    Um diese Variablen außerhalb der Klasse zu nutzen kann man ja Methoden schreiben, die diese Werte als Rückgabewert zurückliefern. Soweit so gut.

    Ich wollte nun aber eine Methode schreiben, die Name, Alter und Größe als Struktur zurückliefert. Damit ich nicht 3 Methoden brauche.

    Ich habe tausende von Varianten ausprobiert, aber irgendwie klappt keine so recht. 😞
    Und im Internet hab ich sonst auch nichts gefunden.

    Habt ihr vielleicht einen Vorschlag, wie man das mittels struct meißtern könnte.

    Oder würdet ihr mir für diesen Fall eine andere Möglichkeit empfehlen, mehrere private Variablen einer Methode zu bekommen.

    Ich danke euch schonmal für eure Antworten! 🙂


  • Administrator

    Wie wäre es damit:

    class CMensch
    {
        std::string m_Name;
        int m_iHeight;
        int m_iOld;
    
    public:
        void get_multiple(std::string& rName, int& riHeight, int& riOld)
        {
            rName = m_Name;
            riHeight = m_iHeight;
            riOld = m_iOld;
        }
    }
    

    Grüssli



  • Also du könntest auch Zeiger auf Variablen übergeben, die gefüllt werden sollen.

    Oder wie du schon sagst ein struct zurückgeben. Was klappt den daran nicht?



  • Die "struct" Variante sieht so aus:

    struct Stuff
    {
        std::string Name;
        unsigned Age;
    };
    
    // old school
    void Human::GetStuff(Stuff& stuff) const
    {
        stuff.Name = ...;
        stuff.Age = ...;
    }
    
    // new school
    Stuff Human::GetStuff() const
    {
        Stuff stuff;
        stuff.Name = ...;
        stuff.Age = ...;
        return stuff;
    }
    

    Ich wollte nun aber eine Methode schreiben, die Name, Alter und Größe als Struktur zurückliefert. Damit ich nicht 3 Methoden brauche.

    Schlechter Grund. "GetMultiple" Methoden sind eigentlich nicht wirklich üblich, normalerweise verwendet man einfach mehrere Methoden die einzelne Werte zurückgeben. Wenn du davon abweichen willst solltest du IMO einen besseren Grund haben als "damit ich nicht 3 Methoden brauche".



  • geht doch ganz einfach:

    struct daten
    {
       std::string name;
       unsigned alter;
       int whatever;
    }
    
    class Person
    {
    private:
       std::string name;
       unsigned age;
       int groesse;
       mutable daten struktur;       // mutable wegen dem const 
    
    public:
       daten GetDaten() const
       {
           // daten struktur;             // oder eben eine temporäre struktur...
           struktur.name = this->name;
           struktur.alter = this->age;
           struktur.whatever = this->groesse;
           return struktur;
       }
    };
    

    kein problem oder?
    wobei die temp variable zu bevorzugen ist wegen der übersichtlichkeit



  • Ok...da stand ich wohl irgendwie aufm Schlauch 🙄 ...werde es aber wahrscheinlich in zukunft doch mit mehreren methoden machen.
    danke euch



  • Argh, hab ich const vergessen... 😞

    @Skym0sh0: Dein "mutable" Konstrukt führt dazu dass die Klasse nichtmehr im "üblichen" Sinn thread-safe ist ("üblich" wäre dass man const Funktionen aus mehreren Threads gleichzeitig aufrufen darf ohne dass schlimme Dinge passieren). Aus DEM Grund würde ich die "temp variable" bevorzugen. 🙂



  • habe grade das wort mutable gelesen und nun interessiert mich was es damit auf sich hat, woltle aer keinen extra thread aufmachen...



  • Quellcode schrieb:

    habe grade das wort mutable gelesen und nun interessiert mich was es damit auf sich hat, woltle aer keinen extra thread aufmachen...

    Wenn eine Methode const deklariert ist kann sie keine Membervariablen ändern. Mit mutable sagst du aber das dies für einzelne Member nicht gilt (die mit mutable deklariert sind).



  • hustbaer schrieb:

    Argh, hab ich const vergessen... 😞

    @Skym0sh0: Dein "mutable" Konstrukt führt dazu dass die Klasse nichtmehr im "üblichen" Sinn thread-safe ist ("üblich" wäre dass man const Funktionen aus mehreren Threads gleichzeitig aufrufen darf ohne dass schlimme Dinge passieren). Aus DEM Grund würde ich die "temp variable" bevorzugen. 🙂

    jo ich hab ja auch dazu geschriebend ass die tmp var zu bevorzugen ist
    wollte eifnach mal mit meinem nicht vorhandenen wissen glänzen 😉 xDDD

    @Quellcode: wie asc gesagt hat
    als mutable deklarierte variablen kann man auch in konstenten methoden ändern...


Anmelden zum Antworten