次の方法で共有


メンバーへのポインター

メンバーへのポインターの宣言にポインター宣言の特殊なケースです。は次の手順を使用して宣言されています :

[storage-class-specifiers] [cv-qualifiers] type-specifiers [ms-modifier]
qualified-name ::* [cv-qualifiers] identifier
[= & qualified-name :: member-name];
  1. 宣言の指定子 :

    • 省略可能なストレージ クラスの指定子。

    • 省略可能な 定数 または volatile の指定子。

    • 型指定子 : 型の名前。これはが指すするメンバーの型ではないクラスです。

  2. 宣言子 :

    • 省略可能な Microsoft の修飾子。詳細についてはMicrosoft 固有の修飾子 を参照してください。

    • 含むクラスの完全修飾名をポイントするメンバー。名前を修飾名 を参照してください。

    • :: 演算子。

    • * 演算子。

    • 省略可能な 定数 または volatile の指定子。

    • メンバーへのポインターを指定する識別子。

    • 省略可能な初期化子 :

= 演算子。

演算子。

クラスの完全修飾名。

:: 演算子です。

適切な型のクラスの静的メンバーの名前。

当然ながら複数の宣言 (および関連の初期化子は一つの宣言では) を使用できます。

クラスのメンバーへのポインターは通常のポインターとメンバーの型とメンバーが属するクラスの型情報がある点。通常のポインター (アドレスはです) メモリの単一のオブジェクトだけを指定します。クラスのメンバーへのポインターはクラスのインスタンスのメンバー指定します。次の例ではデータ メンバーのクラスに Window とポインターを宣言します。

// 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()
{
}

前の例ではpwCaption は型 char* を持つクラス Window のすべてのメンバーへのポインターです。pwCaption の種類は char * Window::* です。次のコードは SetCaption と GetCaption のメンバー関数へのポインターを宣言します。

const char * (Window::*pfnwGC)() = &Window::GetCaption;
bool (Window::*pfnwSC)( const char * ) = &Window::SetCaption;

pfnwGC ポインターと Window の GetCaption と SetCaption への pfnwSC をポイントし各分類します。コードは pwCaption メンバーへのポインターを使用してウィンドウ キャプションに情報を直接コピーします :

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';

– >* の。* と演算子 (ポインターメンバー演算子) の違いは – >* の演算子はポインターを通じてメンバーを選択しますが。* の演算子はオブジェクトやオブジェクト参照を持つメンバーを選択します。これらの演算子の詳細についてはポインターメンバー演算子を含む式 を参照してください)。

ポインターメンバー演算子の結果はメンバーの型 (この場合char * です。

次のコードはメンバーへのポインターを使用してメンバー関数 GetCaption と SetCaption を開始します :

// 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 );

参照

関連項目

C++ の抽象宣言子