Forum: PC-Programmierung C++ Methode für ArgumentenÜbergabe durch "<<" schreiben


von brechpunkt (Gast)


Lesenswert?

"Erst googlen, dann fragen"  :)  aber...

mit welchem Schlagwort werde ich bei Google fündig, wenn ich wissen 
möchte wie ich eine C++ Methode schreiben muss, wenn ich dessen 
Parameter/Argumente mit Hilfe der beiden Zeichen "<<" übergeben möchte?
(also so wie beim "cout() << "la la la";)

: Verschoben durch Admin
von Ralf G. (ralg)


Lesenswert?

operator überladen

von brechpunkt (Gast)


Lesenswert?

Danke schön.

Irgendwie stelle ich mich wohl trotzdem zu blöd an. Ich habe nun diesen 
Code:
1
class debugFile
2
{
3
public:
4
    explicit debugFile(QWidget *parent = 0);
5
    ~debugFile();
6
7
    void console(QString str);
8
    debugFile operator<< (QString str);
9
10
protected:
11
12
};
13
debugFile::debugFile(QWidget *parent)
14
{
15
    qDebug() << "init debug_file";
16
}
17
debugFile::~debugFile()
18
{
19
    qDebug() << "debugFile end";
20
}
21
/* append to console */
22
void debugFile::console(QString str)
23
{
24
}
25
debugFile debugFile::operator<< (QString str)
26
{
27
    qDebug() << str;
28
    return *this;
29
}


Rufe ich diesen nun aber in meiner Main auf,
1
    debug = new debugFile();
2
    debugFile << QString("--> start gui <--");

erhalte ich eine Fehlermeldung:
Fehler:expected unqualified-id before '<<' token

Was soll denn da nicht passen?

von Vlad T. (vlad_tepesch)


Lesenswert?

Sorry, aber ich glaube, du solltest dich erst mal mit den Basics von c++ 
beschäftigen.

Klasse vs Object
Instanz vs Referenz
und nicht zuletzt anerkannte Codingstyles, wie Klassen: Großer 
Anfangsbuchstabe, Objekte: kleiner Anfangsbuchstabe.

von Dussel (Gast)


Lesenswert?

Ganz ohne es nachvollzogen zu haben, soll es nicht
1
    debug = new debugFile();
2
    debug << QString("--> start gui <--");
heißen?

von Mark B. (markbrandis)


Lesenswert?

Dussel schrieb:
> Ganz ohne es nachvollzogen zu haben, soll es nicht
>
1
    debug = new debugFile();
2
    debug << QString("--> start gui <--");
> heißen?

Würde ich auch drauf tippen: Den überladenen Operator auf eine Instanz 
der Klasse anwenden.

: Bearbeitet durch User
von Vlad T. (vlad_tepesch)


Lesenswert?

Dussel schrieb:
> Ganz ohne es nachvollzogen zu haben

das ist ein offensichtliches Problem, ein anderes ist die ganzen 
by-value und non-const parameter und return values

von Malte S. (maltest)


Lesenswert?

Dussel schrieb:
> Ganz ohne es nachvollzogen zu haben, soll es nicht
>
1
    debug = new debugFile();
2
>     debug << QString("--> start gui <--");
> heißen?

debug wurde nie deklariert, muss aber ein Zeigertyp sein. << erwartet 
aber eine Referenz.

brechpunkt schrieb:
> debugFile operator<< (QString str);

Ist allerdings eh Quatsch. Der Rückgabewert sollte hier eine Referenz 
sein und str eine const Referenz.
Diese Dinge haben erstmal Vorrang vor Spielereien mit operator <<

von Karl H. (kbuchegg)


Lesenswert?

Malte S. schrieb:

> Ist allerdings eh Quatsch.

Ganz abgesehen davon, dass man solche Operatoren als freistehende 
Operatoren implementiert. Denn sonst muss man bei jeder weiteren Klasse, 
die sich über so ein debugFile ausgeben können soll, jedes mal die 
Implementierung von debugFile ändern. Und genau das will man eigentlich 
überhaupt nicht.

von Planlos (Gast)


Lesenswert?

Abgesehen von den oben benannten Fehlern:

Macht es Sinn, sowas selber zu programmieren?

die QT-Eigene QDebug Klasse hat einen Constructor
QDebug(QIODevice * device)

Das damit erzeugte QDebug-Objekt schreibt, oh Wunder, seine Ausgabe in 
die angegebene Datei.
Alles fertig, "<<"-Operatoren sind vorhanden, falls doch welche für 
eigene Klassen nachgerüstet werden müssen, sind die dann auch gleich 
Global und für alle sonstigen Debug-Zwecke vorhanden.

Alternative, weniger OO aber oft einfacher/sinnvoller:
qInstallMessageHandler
aus der <QtGlobal> verwenden.

von Sven B. (scummos)


Lesenswert?

Wollte ich auch grad sagen. http://doc.qt.io/qt-5/qtextstream.html

: Bearbeitet durch User
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.