Forum: PC-Programmierung Lambda Frage


von funky (Gast)


Lesenswert?

Hi,

ich habe eine Frage bzgl. Lambdas und ob das was ich möchte überhaupt 
geht(ich habe nicht wirklich Erfahrung mit Lambdas und kapiere noch 
nicht wie ich das hinbekommen kann)

Bisher hätte ich ein Interface gemacht, von dem unterschiedliche 
Item-Klassen ableiten und dann jeweils eine do_action() Methode in jeder 
abgeleiteten Klasse ausimplementiert.

Nun dachte ich mir, es müßte irgendwie gehen, nur eine Klasse zu 
benutzen und dann jeweils eine action per Lambda zuzuweisen, in dem ich 
auch auf Item-Member zugreifen kann
1
#include <iostream>
2
#include <functional>
3
4
typedef  std::function<void(int)> Action;
5
6
class Item {
7
8
public:
9
    Item(Action act, int y)
10
        : action_(act), y_(y) {};
11
12
    void do_action(int x) { action_(x); }
13
14
private:
15
    Action action_;
16
    int y_;
17
18
};
19
20
int main()
21
{
22
    Action a([/*this*/](int x) {  std::cout << "Wert x:  " << x << "Wert y: " /*<< y_*/; });
23
   
24
    Item it1(a, 3);
25
26
    it1.do_action(5);
27
   
28
}

Ich möchte meiner Item Klasse variable Actions hinzufügen(per Lambda) 
und darin dann auf KlassenMember zugreifen. So wie ich es gemacht habe 
geht es offensichtlich nicht.
Wenn ich die Action der Item Klasse zuweise, kann ich dann nicht 
irgendwie per [this] Zugriff auf das Objekt erlangen, dem ich meine 
Action zuweise?

Kann mir jemand sagen wie ich das erreichen kann bzw. was ich falsch 
mache?

Danke für Hilfe!

von Tom (Gast)


Angehängte Dateien:

Lesenswert?

Am einfachsten wäre es, wenn das Item der Action sich selbst als 
Parameter mit übergibt (1.cpp).

Oder ein Item anlegen und die Action später dranhängen, dann kann in der 
Action eine Referenz auf das Item gecapturet werden (2.cpp). Das ist 
aber schon in diesem Mickey-Maus-Beispiel völlig verwirrend.

von Rolf M. (rmagnus)


Lesenswert?

funky schrieb:
> Wenn ich die Action der Item Klasse zuweise, kann ich dann nicht
> irgendwie per [this] Zugriff auf das Objekt erlangen, dem ich meine
> Action zuweise?

Nein, denn in main() gibt es keinen this-Pointer. An der Stelle hast du 
noch nicht mal ein Item-Objekt, das du deiner Action übergeben könntest.

von funky (Gast)


Lesenswert?

Tom schrieb:
> Am einfachsten wäre es, wenn das Item der Action sich selbst als
> Parameter mit übergibt (1.cpp).

Danke...das werde ich mal probieren.

Inwiefern die Lambdas das ganze übersichtlicher, einfacher & 
verständlicher machen hab ich aber noch Zweifel mittlerweile %-)

von PittyJ (Gast)


Lesenswert?

funky schrieb:
> Inwiefern die Lambdas das ganze übersichtlicher, einfacher &
> verständlicher machen hab ich aber noch Zweifel mittlerweile %-)

Ist auch meine Meinung.
Lambda sind prima für "The International Obfuscated C Code Contest"
https://www.ioccc.org/

Wenn die endlich mal C++ zulassen würden....

von Rolf M. (rmagnus)


Lesenswert?

PittyJ schrieb:
> funky schrieb:
>> Inwiefern die Lambdas das ganze übersichtlicher, einfacher &
>> verständlicher machen hab ich aber noch Zweifel mittlerweile %-)
>
> Ist auch meine Meinung.
> Lambda sind prima für "The International Obfuscated C Code Contest"
> https://www.ioccc.org/

Lambdas können sehr nützlich sein, nur sind sie es hier wohl eher nicht.

von Dieter H. (kyblord)


Lesenswert?

lambda macht das ganze doch nur unübersichtlicher.
genauso wie auto finde ich nicht gut.

von Rolf M. (rmagnus)


Lesenswert?

Dieter H. schrieb:
> lambda macht das ganze doch nur unübersichtlicher.
> genauso wie auto finde ich nicht gut.

Da sieht man mal, wie unterschiedlich die Meinungen sind. auto und 
lambdas gehören für mich zu den besten Neuerungen von C++11.

von funky (Gast)


Lesenswert?

Ich würde auch eher denken, ich habe hier den Nagel zum Hammer gesucht.
Habe es jetzt mit Vererbung gemacht und das funktioniert wunderbar.

Habe an anderer Stelle aber auch Lambdas verwendet, und da macht es das 
Leben einfacher und auch klar verständlicher.

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.