2017-11-07 5 views
1

Boost.Asio tutorial 중 하나는 타이머에서 비동기 대기를 생성자 내에서 호출합니다. 클래스 정의 내에서 'this'를 사용합니다.

Printer(boost::asio::io_service& io) : timer_(io, boost::posix_time::seconds(1)), count_(0) { 
    timer_.async_wait(boost::bind(&Printer::print, this)); 
} 

print

print 함수가 인수를하지 않기 때문에 print 기능에 바인딩 왜 (안조차 이해하지 못하는

void print() 
{ 
    if (count_ < 5) 
    { 
     std::cout << count_ << std::endl; 
     ++count_; 

     timer_.expires_at(timer_.expires_at() + boost::posix_time::seconds(1)); 
     timer_.async_wait(boost::bind(&printer::print, this)); 
    } 
} 

에 의해 정의 된 멤버 함수입니다 오류 코드)

코드 샘플에서는 으로 정당화됩니다. 모든 비 정적 클래스 멤버 함수는이 매개 변수를 암시 적으로 갖기 때문에 이것을 함수에 바인딩해야합니다.

하지만 함수에 을 결합 할 수있는 필요을 이해하지 않습니다.

은 누군가가 나이에 계몽 수 있습니까?

+0

Q :'Printer'의 인스턴스가 없다면'count_'는 무엇을 의미합니까? – Mat

+0

메서드가 인스턴스 메서드이고 인스턴스에 바인딩해야하기 때문입니다. – keith

답변

5

개체 함수는에 으로 호출됩니다. 이것이 암시적인 this 매개 변수가있는 이유입니다. 유효한 클래스 인스턴스가 없으면 멤버 함수를 호출 할 수 없습니다.

bind은 바로 그 이유 때문에 회원이 호출 된 개체를 전달해야합니다.

+0

하지만 알다시피, 멤버 함수는 다음과 같이 객체에서 호출됩니다.'object.memberFunction()' 'memberFunction (object)'에 따라 함수를 호출 할 수 있다는 것을 의미합니까? 그렇지 않은 경우 개체 자체를 자체 멤버 함수의 인수로 전달하는 구문을 이해하지 못합니다. –

+1

@PierreP. 누가'bind'를'memberFunction (object)'로 부르는가? 여기에는 컴파일시 이러한 호출을 해결하는 논리가 포함됩니다. 멤버 액세스 구문을 사용하여 호출합니다. – StoryTeller

+0

알았어! 'this'를 멤버 함수'print'에 바인딩하면'print'가 호출 될 때마다'this' 인스턴스에서 호출 될 것입니다. 그게 맞습니까? –

1

print 함수는 Printer 클래스의 비 정적 멤버 함수입니다. 다른 비 정적 멤버 함수와 마찬가지로 클래스 인스턴스 필드 (이 경우 timer_count_)에 액세스 할 수있는 암시 적 this 매개 변수를받습니다. 부스트 시간으로 호출 할 수있는 Functor는 매개 변수가없는 것으로 제한되며, 이는 bind이 타이머에 의해 호출되고 내부적으로 this 포인터를 사용하여 Printer::print을 호출하는 operator()을 제공하는 구조로 오는 곳입니다.