Default-Parameter "this"
-
DocShoe schrieb:
Was du möchtest, ist nicht
this
des Workers, sondern dasthis
(that? :D) des Aufrufers? Dafür gib´s in C++ keine Sprachmittel, außer halt Parameter.Genau. In C# war das, soweit ich mich erinnern kann, möglich. Danke erst mal.
-
Aber warum soll dann der Parameter überhaupt einen Default-Wert bekommen?
-
Belli schrieb:
Aber warum soll dann der Parameter überhaupt einen Default-Wert bekommen?
// irgendwo in einer Klasse die worker verwendet worker.doSomething(); // this würde per default übergeben...
Damit stillschweigend das aufrufende Objekt an Worker übergeben wird, sobald die Funktion aufgerufen wird und damit worker weiß, von wem er aufgerufen wurde.
Der Haken an der Sache wäre allerdings, dass diese Info durch Angabe eines Parameters gefälscht werden könnte. Auch blöd. Mindestens genauso blöd wie eine Funktionsdoku in der steht: "An dieser Stelle immer 'this' verwenden!".
-
Warum muss der Worker das wissen?
-
temi schrieb:
Damit stillschweigend das aufrufende Objekt an Worker übergeben wird
Keine Ahnung, was Du meinst, aber Du rufst doch
worker.doSomething(this);
aus bar und aus foo auf, da ist nix stillschweigendes (ist auch nicht möglich).
-
Dieses Template ist halt eh sinnlos, wenn du this als Default-Parameter angibst. this ist immer das gleiche, ein Zeiger auf die jeweilige Instanz von Worker.
Mach Überladungen.
-
Belli schrieb:
temi schrieb:
Damit stillschweigend das aufrufende Objekt an Worker übergeben wird
Keine Ahnung, was Du meinst, aber Du rufst doch
worker.doSomething(this);
aus bar und aus foo auf, da ist nix stillschweigendes (ist auch nicht möglich).
Ähm, ja. Da es offenbar nicht anders möglich ist, habe ich das so gemacht, wobei der Wunsch und die Frage lautete, ob (wie auch immer) "this" als Default-Parameter möglich ist, damit ich es eben nicht beim Aufruf angeben muss. Da es nicht geht (und weil die Idee noch ein paar Haken hat), hat sich das erledigt
Gruß,
temi
-
DocShoe schrieb:
Warum muss der Worker das wissen?
Das ist geheim
Nein, natürlich nicht. Worker soll abhängig vom aufrufenden Objekt die übergebenen Daten anders behandeln und dazu parametrierbar sein, z.B. (PSEUDOCODE!)
FileWorker schreibt Daten in eine Datei.
DbWorker schreibt Daten in eine Datenbank.FileWorker fw; fw.canHandle(Foo); fw.canHandle(Bar); DbWorker dw; dw.canHandle(Foo); CompositWorker worker; // verhält sich wie ein Worker worker.add(fw); worker.add(dw); Foo foo(worker); Bar bar(worker); foo.run(); // wird von Fileworker und von DbWorker behandelt bar.run(); // wird nur von DbWorker behandelt
Das war die Grundidee.
-
Das klingt, als ob
Foo foo(worker); Bar bar(dw);
vernünftig wäre ...
-
Belli schrieb:
Das klingt, als ob
Foo foo(worker); Bar bar(dw);
vernünftig wäre ...
Nö.
CompositWorker worker; worker.configFromFile("worker.config"); ...