2015-01-06 11 views
11

Şu an için boost/asio ile kodlamayı öğreniyorum. Birçok kod örneği async_accept ve bind kombinasyonunu kullanır. Sunucu kodunda, ben böyle bazı şey rastlamak:Aynı sınıfta tanımlanan bu iki işlev, ileri bildirim olmadan birbirlerini aramak için nasıl yönetilir?

class Tcp_server 
{ 
public: 
    Tcp_server() 
    { 

    } 
    void start_accept(int a) 
    { 
     if(a>0) 
     { 
      cout<<a<<endl; 
      handle_accept(a-1); 
     } 

    } 

    void handle_accept(int a) 
    { 
     if(a>0) 
     { 
      cout<<a<<endl; 
      start_accept(a-1); 
     } 

    } 
}; 

i Tcp_server bir örneğini yapmak ve handle_accept ya arayın veya kabul başlarsak, işe yarıyor. Ama eğer Tcp_server sınıfı kapsülleme işlemini bırakırsam, derleyici "handle_accept bildirilmiyor" diye şikayet ederdi. Derleyicinin otomatik olarak ileriye doğru aynı sınıfta tanımlanan tüm işlevleri bildirip bildirmediğini merak ediyorum. Nedenini açıklayan var mı?

cevap

9

Bir sınıf tanımında tanımlanan işlevler, yalnızca sınıf tanımında bildirilmişler ve sonra sınıf tanımından hemen sonra tanımlanmışlar gibi tam olarak aynı semantiğe sahiptir. Tek fark, bu işlev fonksiyonlarının, bir fonksiyon tanımı ya satır içi ya da açık bir şekilde satır içi iken, kapalı olarak bildirilmesidir. Yani, derleyicinin bakış açısına göre işlevler bildirilir ve işlev tanımları dikkate alınmadan sınıf tanımlanır.

Sınıf tanımından sonra işlevi tanımlamanın nedeni basittir: bunu yapmadan, sınıf eksik olur ve üye işlev tanımları için açıkça arzu edilmeyen üyelerin başarısızlıkları başarısız olur. Bir yan etki olarak, işlevler birbirlerini kolayca ifade edebilir. Sınıf tanımındaki üye fonksiyonlarını tanımlamak öncelikle kolaylık sağlamak olduğundan, daha sonra kullanılan üye fonksiyonlar için beyan gerektirmek de biraz rahatsız edici olacaktır.

+1

Ama bu tasarım kararının (muhtemelen) neden yapıldığının nedeni bu değil midir? Bilmeyi çok merak ediyorum, BTW. – Drop

+1

sadece @Drop'un dediği gibi, bunun ardındaki mantık nedir? – spiritsaway

+2

@Drop Bu kararın sebebi, beyanların tanımlarla birleştirildiği durumlarda standardın bir ileri bildirim gerektirmesi gerektiğindeyse, sınıf içerisindeki tanımlayıcı fonksiyonların, özelliği tamamen kullanamayacağı noktaya göre, daha az uygun hale gelmesidir. . – dasblinkenlight

İlgili konular