Rückgabe für eigenen Datentyp

Du bist neu in der Welt von C++? Dann schau hier herein!
Antworten
Codiac
Beiträge: 21
Registriert: 23. Mai 2013 11:00

Rückgabe für eigenen Datentyp

Beitrag von Codiac » 12. Oktober 2015 15:34

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

Christian81
Beiträge: 7313
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: Rückgabe für eigenen Datentyp

Beitrag von Christian81 » 12. Oktober 2015 18:22

Es fehlt der operator()

Code: Alles auswählen

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

'Funktioniert nicht' ist keine Fehlerbeschreibung

Codiac
Beiträge: 21
Registriert: 23. Mai 2013 11:00

Re: Rückgabe für eigenen Datentyp

Beitrag von Codiac » 13. Oktober 2015 07:16

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

archer
Beiträge: 306
Registriert: 2. Februar 2006 10:56

Re: Rückgabe für eigenen Datentyp

Beitrag von archer » 13. Oktober 2015 14:19

Da müsste der Operator anders aussehen:

Code: Alles auswählen

operator QString() const;

Code: Alles auswählen

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

Christian81
Beiträge: 7313
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: Rückgabe für eigenen Datentyp

Beitrag von Christian81 » 13. Oktober 2015 17:50

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.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung

RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Re: Rückgabe für eigenen Datentyp

Beitrag von RHBaum » 16. Oktober 2015 08:51

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 ...

Antworten