How do I implement a callback in C++?を読んで、Observer Patternへの参照に特に注意してください。このような緊密に結合されたクラスが2つある場合は、テストがすぐに悪夢になるため、デザインを再考することをお勧めします。ここでは、言った
は
#include <iostream>
class First;
// Typedefs make this much more readable: http://www.parashift.com/c++-faq-lite/pointers-to-members.html#faq-33.5
typedef void (First::*SecondTriggeredCallback)(void);
// And macros make the call much more readable: http://www.parashift.com/c++-faq-lite/pointers-to-members.html#faq-33.6
#define CALL_MEMBER_FN(object, ptrToMember) ((object).*(ptrToMember))
class Second
{
public:
// You'll also need an *instance* of the First class
Second(SecondTriggeredCallback SecondTriggered, First& first)
{
CALL_MEMBER_FN(first, SecondTriggered)();
}
};
class First
{
private:
Second *second;
public:
First()
{
std::cout << "first class was created" << std::endl;
second = new Second(&First::SecondTriggered, *this);
}
~First()
{
delete second;
}
void SecondTriggered()
{
std::cout << "second class was created and responded" << std::endl;
}
};
int main()
{
First first;
}
See it run ...あなたが開始した実装を完了する方法です!ここで
を使用したテンプレートにより、結合を削除したバージョンです:あなたはまた、関数オブジェクトを渡す検討することができる
#include <iostream>
// Macros make the call much more readable: http://www.parashift.com/c++-faq-lite/pointers-to-members.html#faq-33.6
#define CALL_MEMBER_FN(object, ptrToMember) ((object).*(ptrToMember))
template <class T>
struct Second
{
// Typedefs make this much more readable: http://www.parashift.com/c++-faq-lite/pointers-to-members.html#faq-33.5
typedef void (T::*SecondTriggeredCallback)(void);
// You'll also need an *instance* of the "T" class
Second(SecondTriggeredCallback SecondTriggered, T& t)
{
CALL_MEMBER_FN(t, SecondTriggered)();
}
};
class First
{
public:
First()
:second(NULL)
{
std::cout << "first class was created" << std::endl;
second = new Second<First>(&First::SecondTriggered, *this);
}
~First()
{
delete second;
}
void SecondTriggered()
{
std::cout << "second class was created and responded" << std::endl;
}
private:
First(const First&);
First& operator =(const First&);
Second<First>* second;
};
int main()
{
First first;
}
[あなたがしようとしている根本的な問題は何ですか解決する](http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)? – Johnsyweb
第2クラスをファーストクラスのメンバ関数を起動させることができますが、関数全体のクラス全体へのポインタは送信しません。 – aquawicket
@dasblinkenlightああ、その間に起こったことを知らなかった。私のコメントも削除しました。 – smocking