Seite 1 von 1

Rückgabe für eigenen Datentyp

Verfasst: 12. Oktober 2015 15:34
von Codiac
Hallo zusammen,

Ich wüsste gerne, wie ich eine "methodenlose" Rückgabe für eigene Datentypen programmieren kann.
Meine Klasse...

Code: Alles auswählen

class myClass
{
public:
               myClass(const QString &value);
    QString    getValue(void);

private:
    QString    curValue;
};

myClass::myClass(const QString &value)
{
    curValue = value;
}

QString myClass::getValue()
{
    return(curValue);
}
...rückt den Wert momentan nur so raus:

Code: Alles auswählen

myClass str = "Hallo!";
QMessageBox::information(0, "", str.getValue());
Ich hätte aber gerne ein Handling ohne getValue(), wie bspw. bei einem QString:

Code: Alles auswählen

QString str = "Hallo!";
QMessageBox::information(0, "", str);
Was fehlt meiner Klasse dazu?

Grüße,
Codiac

Re: Rückgabe für eigenen Datentyp

Verfasst: 12. Oktober 2015 18:22
von Christian81
Es fehlt der operator()

Code: Alles auswählen

QString operator()()const { return curValue; }

Re: Rückgabe für eigenen Datentyp

Verfasst: 13. Oktober 2015 07:16
von Codiac
Danke Christian! Das bringt mich schon mal einen Schritt weiter.
Der folgende Code funktioniert:

Code: Alles auswählen

myClass val("123,45");
QString out = val();
Ich möchte meine Instanz aber gerne ohne Klammern benutzen. Dabei erhalte ich die folgende Fehlermeldung:

Code: Alles auswählen

myClass val("123,45");
QString out = val;

conversion from 'myClass' to non-scalar type 'QString' requested

Re: Rückgabe für eigenen Datentyp

Verfasst: 13. Oktober 2015 14:19
von archer
Da müsste der Operator anders aussehen:

Code: Alles auswählen

operator QString() const;

Code: Alles auswählen

myClass::operator QString() const
{
    return curValue;
}

Re: Rückgabe für eigenen Datentyp

Verfasst: 13. Oktober 2015 17:50
von Christian81
Das käme einen impliziten cast gleich und ist meiner Meinung nach unschöner Code denn man versteckt so, was wirklich passiert, ebenso bei operator() wie von mir vorgeschlagen.

Re: Rückgabe für eigenen Datentyp

Verfasst: 16. Oktober 2015 08:51
von RHBaum
Das käme einen impliziten cast gleich und ist meiner Meinung nach unschöner Code denn man versteckt so, was wirklich passiert, ebenso bei operator() wie von mir vorgeschlagen.
richtig !

Und genau deswegen sollte auch auch der Konstruktor mit const QString & explizit sein !

myClass val("123,45"); // Das ist ok

QString strX("123,45");
myclass val = strX; // das sollte nicht ok sein .... obwohl hier noch ersichtlich ist was passiert

void foo(myclass value);
foo("123,45"); // das ist eher kritisch

Es sei denn deine Klasse myclass soll wirklich ein String Ersatz sein ...
(nur) dann sollte man aber auch die 3 Konvertierungs - Funktionalitaeten implementieren:
Konvertierung Konstruktor: Class::Class(const T &);
Konvertierung Zuweisung Class & Class::operator = (const T &);
und Konvertierungs Operator Class::operator T ();

Ciao ...