Zeiger auf Member
Deklarationen von Zeigern auf Member sind Sonderfälle von Zeigerdeklarationen. Sie können mithilfe der folgenden Sequenz deklariert werden:
[storage-class-specifiers] [cv-qualifiers] type-specifiers [ms-modifier]
qualified-name ::* [cv-qualifiers] identifier
[= & qualified-name :: member-name];
Der Deklarationsbezeichner:
Ein optionaler Speicherklassenbezeichner.
Optionale const- und/oder volatile-Bezeichner.
Der Typspezifizierer: der Name eines Typs Dies ist der Typ des Members, auf das gezeigt werden muss, nicht der der Klasse.
Der Deklarator:
Ein optionaler Microsoft-spezifischer Modifizierer. Weitere Informationen finden Sie unter Microsoft-spezifische Modifizierer.
Der qualifizierte Name der Klasse, die die Member enthält, auf die gezeigt werden muss. Siehe Namen und qualifizierte Namen.
Der Operator "::"
Der Operator *.
Optionale const- und/oder volatile-Bezeichner.
Der Bezeichner, der den Zeiger auf ein Member benennt.
Ein optionaler Initialisierer:
Dem Operator =.
Der Operator &.
Der qualifizierte Name der Klasse.
Der Operator ::.
Der Name eines nicht statischen Members der Klasse des entsprechenden Typs.
Wie immer sind mehrere Deklaratoren (sowie alle zugeordneten Initialisierer) in einer einzelnen Deklaration zulässig.
Ein Zeiger auf einen Member einer Klasse unterscheidet sich von einem normalen Zeiger, da er Typinformationen für den Membertyp und die Klasse besitzt, zu der der Member gehört. Ein normaler Zeiger identifiziert nur ein einzelnes Objekt im Arbeitsspeicher (hat nur die Adresse dieses Objekts). Ein Zeiger auf einen Member einer Klasse identifiziert den Member in jeder Instanz der Klasse. Im folgenden Beispiel werden die Klasse Window und mehrere Zeiger auf Memberdaten deklariert.
// pointers_to_members1.cpp
class Window
{
public:
Window(); // Default constructor.
Window( int x1, int y1, // Constructor specifying
int x2, int y2 ); // window size.
bool SetCaption( const char *szTitle ); // Set window caption.
const char *GetCaption(); // Get window caption.
char *szWinCaption; // Window caption.
};
// Declare a pointer to the data member szWinCaption.
char * Window::* pwCaption = &Window::szWinCaption;
int main()
{
}
Im obigen Beispiel ist pwCaption ein Zeiger auf einen Member der Klasse Window, die zum Typ char* gehört. Der Typ von pwCaption lautet char * Window::*. Im nächsten Codefragment werden Zeiger auf die Memberfunktionen SetCaption und GetCaption deklariert.
const char * (Window::*pfnwGC)() = &Window::GetCaption;
bool (Window::*pfnwSC)( const char * ) = &Window::SetCaption;
Die Zeiger pfnwGC und pfnwSC zeigen auf GetCaption bzw. SetCaption der Klasse Window. Mithilfe des Zeigers auf den Member pwCaption kopiert der Code Informationen direkt in die Fensterbeschriftung:
Window wMainWindow;
Window *pwChildWindow = new Window;
char *szUntitled = "Untitled - ";
int cUntitledLen = strlen( szUntitled );
strcpy_s( wMainWindow.*pwCaption, cUntitledLen, szUntitled );
(wMainWindow.*pwCaption)[cUntitledLen - 1] = '1'; //same as
//wMainWindow.SzWinCaption [cUntitledLen - 1] = '1';
strcpy_s( pwChildWindow->*pwCaption, cUntitledLen, szUntitled );
(pwChildWindow->*pwCaption)[cUntitledLen - 1] = '2'; //same as //pwChildWindow->szWinCaption[cUntitledLen - 1] = '2';
Der Unterschied zwischen den Operatoren .* und –>* (Memberzeiger-Operatoren) besteht darin, dass der Operator .* die Member anhand eines Objekts oder Objektverweises auswählt, während der Operator –>* Member über einen Zeiger auswählt. (Weitere Informationen zu diesen Operatoren finden Sie unter Ausdrücke mit Memberzeiger-Operatoren.)
Das Ergebnis der Memberzeiger-Operatoren ist der Membertyp – in diesem Fall char *.
Im folgenden Codefragment werden die Memberfunktionen GetCaption und SetCaption mithilfe der Zeiger auf Member aufgerufen:
// Allocate a buffer.
enum {
sizeOfBuffer = 100
};
char szCaptionBase[sizeOfBuffer];
// Copy the main window caption into the buffer
// and append " [View 1]".
strcpy_s( szCaptionBase, sizeOfBuffer, (wMainWindow.*pfnwGC)() );
strcat_s( szCaptionBase, sizeOfBuffer, " [View 1]" );
// Set the child window's caption.
(pwChildWindow->*pfnwSC)( szCaptionBase );