クラスの静的メンバー関数がクラスの非静的メンバーを呼び出す方法
クラスで静的メンバー関数を使用するのは、静的メンバー関数がクラスの静的メンバーのみを呼び出すため、カプセル化を破壊する動作です.しかし、クラス内で自身のメンバー関数をコールバック関数としてバインドするなど、静的メンバー関数しか使用できない場合があります.この場合、マルチスレッドを開くときによく見られますが、コールバックをグローバルとして定義したくない場合は、クラスの静的として定義するしかありません.パッケージクラスを過度に破壊しないように、クラスの静的元の関数にクラスメンバーを呼び出さないようにしてください.この場合、比較的巧みな方法を用いることができる.
クラスの静的メンバーと通常のメンバーは、静的メンバー自体にthisポインタがないため、静的メンバーはクラスに属し、クラスオブジェクトに属しません.クラスの静的メンバー関数でクラスの一般メンバーを呼び出すには、クラスポインタをパラメータとして静的メンバー関数に渡すだけです.静的メンバー関数では、このポインタを使用してクラスの一般メンバーを呼び出すことができます.demoは次のようになります.
#include "stdafx.h"
#include
#include
using namespace std;
class A
{
private:
string str;
public:
void handler(string _str)
{
str = _str;
cout<(p_A);
_p->handler(_str);
}
void start()
{
void *p = this;
string _str = "static";
handler_static(p,_str);
}
};
int _tmain(int argc, _TCHAR* argv[])
{
A a;
a.start();
getchar();
return 0;
}
handler_staticは静的メンバー関数で、パラメータは2つあり、1つ目は自分のオブジェクトthisポインタで、もう1つは実際に入力する必要があるパラメータです.ここで実装される機能は、クラスの静的メンバー関数を使用してクラスの通常のメンバー変数strに値を割り当てるものであり、このようなthisポインタに間接的に呼び出されない場合、strも静的として定義する必要があります.もちろんここではあまり意味がないように見えますが、handlerメンバー関数でthisポインタを受信して間接的に機能を実現しただけです.しかし、コードが複雑な場合、この方法はパッケージを過度に破壊することを避けることができ、静的な場所(例えば、コールバックをバインドする)を使用して静的メンバーを定義しなければ、静的メンバーが使用する連鎖反応はありません.