2010-04-08 309 views
2

這是一個問題,我已經提前討論過了。 基本上,一個C++對象有一個成員對象,可以完成一些工作,一旦工作完成,需要向父對象發出通知。 允許這種交流的最優雅的解決方案是什麼? 在這個位置是否表明設計缺陷?C++對象之間的通信

詳細說明。

class A { 
    B member; 
    void do_something(); 
} 

class B{ 
void talk_to_network(); 
}; 


void do_something() 
{ 
    //Conditional wait on a variable that will change when talk to network completes. 
    //So need a way for B to inform A, that it is done. 

} 

回答

2

除非您正在討論併發(線程),否則返回操作結果的常用方法是從函數返回值。

它可能取決於你的意思是「成員對象」。你的意思是某個班級的數據成員?

class A { }; 

class B 
{ 
    A member; 
}; 

如果A有一個成員函數「做一些工作」,即成員函數應(第一近似)返回結果爲正常的返回值。這是做這種事最簡單的方法。所以B調用該方法並返回結果。

如果必須返回多個結果,則可以將函數類對象傳遞給A的成員函數,以便它可以回調它。

+0

感謝respsonse。我應該早些提到線程。我修改了這個問題 – Pradyot 2010-04-08 19:41:52

2

既然你顯然與多線程處理,正常的方法是通過某種信號變量的從A至B的地址時,do_something電話talk_to_network。用於信號傳輸的確切類型因操作系統而異 - 對於Windows,您可能會使用Event。如果您使用pthreads,那麼您可能會使用condition variable作爲信號。

0

當使用併發時,通常有兩種算法:pending和signaling。

一個線程可以等待或掛起一個事件標誌。處理線程會在處理完成後設置事件。這種技術的一個棘手是,直到事件被設置,停止的線程纔會停止。

在發信號時,控制線程將請求發送到處理任務,然後繼續執行其他任務。處理任務將在處理完成時向控制線程發送一個信號,並將其中斷。控制線程可能偶爾輪詢事件標誌,而不是中斷。

在任何情況下,信號和事件處理都是操作系統問題,並且因操作系統而異。 C和C++語言沒有用於信號和事件處理的標準工具。

0

在我們的辦公室,我們使用了略微修改的Boost Signals實現此目的。我們取得了很好的成功。在你的例子中,A用一個信號註冊一個回調函數。當B完成其工作時,它會調用信號讓A知道它已完成。