これは、変数メンバーよりも関数の方がはるかに便利だと思いますが、同じ原則が両方に適用されます。
実行しているプロセッサなどに依存する1つのことを行う3つの機能を持つクラスがあるとします(つまり、INTELとAMD、またはSSE4をサポートするプロセッサとSSE2のみの古いプロセス...)
void renderCPU();
void renderSSE2();
void renderSSE3();
void renderSSE4();
次に、これらの関数のいずれかのポインターを取得し、レンダリングするたびに SSE4、SSE3、SSE2、または CPU があるかどうかをテストする代わりにポインターを使用します。
// in constructor
if (SSE4) render_ptr = &C::renderSSE4;
else if (SSE3) render_ptr = &C::renderSSE3;
else if (SSE2) render_ptr = &C::renderSSE2;
else render_ptr = &C::renderCPU;
// And in the render function:
this->*render_ptr();
変数メンバーの場合、同様のことが起こる可能性がありますが、率直に言って、変数にそれを使用したことはありません。おそらく、ストレートポインター(例では「int *」など)も使用できるためです...)セキュリティを強化するためにクラスポインタを使用するというアイデア。
さて、しばらく前に、プライベートな変数メンバーへの public const 参照ポインターを持つクラスを使用したことを思い出します。実際には、実際に関数を呼び出す必要なく、ユーザーに getter() を提供していました。この手法の問題点の 1 つは、参照が作成時にロックされることです。
class P
{
private:
int v_;
public:
const int& value;
p()
: value(v_) // locked...
{
}
};
クラス変数ポインターを使用すると、オブジェクトの使用中にポインターを変更できます。
class P
{
private:
int x_;
int y_;
int z_;
public:
const int P::*ref;
p()
: ref(&P::x_) // not locked...
{
}
void modeX()
{
ref = &P::x_;
}
void modeY()
{
ref = &P::y_;
}
void modeZ()
{
ref = &P::z_;
}
};
このようなクラスを使用すると、次のようなことができるはずです。
P p;
cout << p.*p.ref; // write x_
p.modeZ();
cout << p.*p.ref; // write z_
これにより、裸のポインターとは対照的に、「値」が非常に安全になります。
また、次のように記述できることにも注意してください。
P p, q;
p.*q.ref = q.*p.ref;
これは一部の人々に役立つかもしれません...