이전에 boost :: bind 함수를 변수에 저장하여 나중에 필요할 때 함수를 호출 할 수있었습니다.내부 클래스에 boost :: bind 함수를 전달하는 중 오류가 발생했습니다.
//Caller, note the Accepthandler function is specified here
mysocket->RegisterAcceptHandler(boost::bind(&AcceptHandler,_1,_2));
//Registration function, a member of the socket class. cnctCallBack is a typedef to a boost:function
void mynamespace::socket::RegisterAcceptHandler(const cnctCallBack &cb)
{
connectCallBack = cb;
}
을하고 적절한 인수와 함께 원하는대로 connectCallBack 전화 : 그것은 매우 간단합니다, 당신은 단순히 같은 것을 할.
내 문제는 이제 처리기가 내부 멤버 개체에서 함수를 등록하도록하려는 것입니다. 다시 말해 소켓은 더 이상 콜백을 호출하지 않지만 내부 클래스는 콜백에 대해 알리고 호출합니다. 당신은 당신이 단순히 내부 클래스에서 함수에 & CB를 할당 할 수 있다고 생각 싶지만, 그렇게 될하지 밝혀 : 나는 outerclass을 실행할 때
typedef boost::function<void()> recCB;
class InnerClass{
public:
void AttachListener(const recCB &rcb);
void RunListener();
private:
boost::function<void()> callback;
};
void InnerClass::AttachListener(const boost::function<void()> &rcb)
{
callback = rcb;
}
void InnerClass::RunListener()
{
callback();
}
class OuterClass{
public:
void AttachListener(const boost::function<void()> &rcb);
void RunListener();
private:
InnerClass * ic;
boost::function<void()> cb;
};
void OuterClass::AttachListener(const boost::function<void()> &rcb)
{
cb = rcb;
ic->AttachListener(rcb);
}
void OuterClass::RunListener()
{
cb();
ic->RunListener();
}
이 밝혀과 기능을 할당하려고 OuterClass.AttachListener를 사용하면 0xfffff ...에서 액세스 위반이 발생합니다. 이는 상당히 눈에 띄는 주소입니다. 호출 스택을 살펴보면 할당 연산자에 대한 문제가 문제의 원인이지만 문제가 무엇인지 알 수 없습니다. 외부 클래스의 변수에 할당 할 때 동일한 할당 코드가 작동하는지 확인하기는 쉽습니다. 당신이 한 수준에서만 이것을 할 수 있다는 것을 의미하는 * 것에 대해 뭔가가 있는지 궁금합니다.
오 주여, 나는 생각하지 못했습니다. 그것은 단순한 ic = 새로운 InnerClass()로 작동합니다. 나는 침대가 서서히 지쳐 있다고 느낍니다. – Carlos
@ 카를로스 : 그러나 그렇게하지 마십시오. 당신이 * 포인터를 정말로 필요로하지 않는 한, 내 대답에서 제안한대로해라.이 경우에 당신은 당신의 필요에 맞는'std :: unique_ptr' 또는'std :: shared_ptr'를 사용해야한다. – Nawaz
예, 공유 포인터 등으로 아이디어를 이해합니다. 아마도 메모리 누수의 가능성을 허용하지 않는 것이 가장 좋습니다. 나는 방금 정확히 무엇이 파괴되고 있는지보기 위해 테스트 케이스를 만들었다. – Carlos