Eine coole Sache mit C++ ist, dass Sie Variablen von Zeiger-zu-Mitglied-Typen erstellen können. Der häufigste Anwendungsfall scheint einen Zeiger auf eine Methode, um zu sein:Was ist ein `int foo :: * bar :: *`?
struct foo
{
int x() { return 5; }
};
int (foo::*ptr)() = &foo::x;
foo myFoo;
cout << (myFoo.*ptr)() << '\n'; // prints "5"
jedoch rumgespielt, erkannte ich, dass sie genauso gut auf Membervariablen zeigen:
struct foo
{
int y;
};
int foo::*ptr = &foo::y;
foo myFoo;
myFoo.*ptr = 5;
cout << myFoo.y << '\n'; // prints "5"
Dies ist zielich abgefahren. Es führte mich zu einem weiteren Experiment: Was wäre, wenn Sie einen Zeiger auf ein Unterelement einer Struktur bekommen könnten?
struct foo
{
int y;
};
struct bar
{
foo aFoo;
};
int bar::*foo::*ptr;
Diese actually compiles.
Allerdings habe ich keine Ahnung, wie man es sinnvoll nutzen kann. Keiner der folgenden Werke:
int bar::*foo::*ptr = &bar::foo::y; // no member named "foo" in "bar"
int bar::*foo::*ptr = &bar::aFoo::y; // no member named "aFoo" in "bar" (??)
int bar::*foo::*ptr = &foo::y; // can't init 'int bar::*foo::*' with 'int foo::*'
Des Weiteren nach dem Fehler, dass dies erzeugt, scheint es, dass diese Art nicht genau das, was ich im Sinn haben:
int bar::*foo::*ptr = nullptr;
bar myBar;
myBar.*ptr = 4; // pointer to member type ‘int bar::*’ incompatible
// with object type ‘bar’
Es scheint, dass dieses Konzept ausweicht mich. Offensichtlich kann ich nicht ausschließen, dass es auf eine ganz andere Weise geparst wird, als ich es erwartet hätte.
Würde mir bitte jemand erklären, was ein int bar::*foo::*
eigentlich ist? Warum sagt GCC mir, dass ein Zeiger auf ein Mitglied von bar
mit einem bar
Objekt nicht kompatibel ist? Wie würde ich eine int bar::*foo::*
verwenden, und wie würde ich eine gültige konstruieren?
Das sieht nach einem Umweg aus, was 'decltype()' mit entsprechenden Templates schon liefert? – slashmais
Vielleicht weiß ich nicht genug über das Thema, aber wenn es hilft, 'int bar :: * foo :: * ptr = * neuer decltype (ptr);' kompiliert, aber ich weiß nicht, was es tut und ich kann nichts mit dem Ergebnis zu tun scheinen. Es ist auch ein Speicherleck, aber manchmal muss die Erinnerung im Namen der Wissenschaft geopfert werden. – IllusiveBrian
Meine Güte, wenn die Autoren des Compilers dies implementiert haben, schwöre ich, dass sie eine Menge darüber schworen, wer zum Teufel jemals das benutzen wird. – marczellm