Forum: PC-Programmierung QT Objekt als Rückgabewert


von Symsonic (Gast)


Lesenswert?

Hallo,

ich programmiere gerade C++ unter QT und habe ein Problem damit ein 
Objekt (einer eigenen Klasse) zurückzugeben.
Ich möchte später die Statische Methode accquireTemperature 
folgendermaßen aufrufen können:
1
Message xyz123 = Message::accquireTemperature(123);

Doch der Compiler (gcc, QT 4.7.3 unter Linux) meckert beim returnwert 
der Methode dass er den Copyconstructor (?) nicht findet, obwohl ich 
diesen implementiert habe:

no matching function for call to 'Message::Message(Message&)'

Was habe ich hier falsch gemacht?

Danke!!

1
class Message {
2
public:
3
    explicit Message(const Message & cpy);
4
    explicit Message(Message & cpy);
5
    explicit Message(quint32 mac);
6
    virtual ~Message();
7
public:
8
    static Message accquireTemperature(quint32 mac);
9
public:
10
    QByteArray message;
11
};
1
Message::Message(const Message & cpy) {
2
    message = cpy.message;
3
}
4
5
Message::Message(Message & cpy) {
6
    message = cpy.message;
7
}
8
9
Message::Message(quint32 mac) {
10
    // .....
11
}
12
Message Message::accquireTemperature(quint32 mac) {
13
    Message a(mac);
14
    return(a);
15
}

von ich (Gast)


Lesenswert?

Wenn du den Copyconstructor als explicit definierst, dann kann der 
Compieler diesen nicht implizit verwenden.
D.h. wenn du das explicit vor dem Copyconstructor entfernst, sollte es 
funktionieren.

von Vlad T. (vlad_tepesch)


Lesenswert?

explizite Copyconstrukturen machen imho auch nicht so viel Sinn.
Bei anderen ctors macht man das, damit der Compiler nicht auf die Idee 
kommt, bei Fehler wie:
1
Message msg;
2
int msgCnt =0;
3
4
msg  = 4; // statt msgCount  msg benutzt
den Message(int) Ctor zu callen

Ich frag mich auch, wozu der copy-ctors  mit dem nicht-const-Objekt da 
sein soll.

von Symsonic (Gast)


Lesenswert?

ich schrieb:
> wenn du das explicit vor dem Copyconstructor entfernst, sollte es
> funktionieren

Ja funktioniert, vielen Dank!

Vlad Tepesch schrieb:
> explizite Copyconstrukturen machen imho auch nicht so viel Sinn

Der QT Creator baut dies automatisch davor wenn man eine Klasse erzeugen 
lässt und so habe ich dass dann auch übernommen.

Vlad Tepesch schrieb:
> Ich frag mich auch, wozu der copy-ctors  mit dem nicht-const-Objekt da
> sein soll.

Hatte ich versuchsweise eingebaut und bereits wieder entfernt. Vielen 
Dank für den Hinweis

Mfg,
Mike

von Peter II (Gast)


Lesenswert?

eigentlich kann man den Copyconstrukturen hier komplett weglassen, ist 
nur eine Fehlerquelle mehr wenn noch ein member objekt dazu kommt.

von Rolf Magnus (Gast)


Lesenswert?

Abgesehen davon wäre es besser, in Konstruktoren soweit möglich die 
Member zu initialisieren und nicht zuzuweisen. Den Copy-Konstruktor mit 
nicht-const-Parameter kann man sich auch sparen. Den braucht man nur, 
wenn der Konstruktor nicht nur die Kopie, sondern auch das Original 
verändern will.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.