今天因為需要把一個winsock代碼封裝到C++類中,但是在過程中,遇到了不少問題,都是我以前知道的,但是忘了的。
今天專門好好地寫一篇博文,免得以后忘了還要百度。
首先我原來的程序主動創建了3個線程,算上main,一共是4個線程。
封裝為C++類后,因為不能因創建的對象而阻塞原程序,所以在需要創建一個替代main的主線程。
這樣就是4個線程了,其中2個線程用的是同一個函數。而且這四個線程我只想讓我的對象用,對外部應該是不可見的,所以,要封裝到類里面。
我前面的一篇博文也說了,類中的函數若想成為線程函數,則必須為靜態成員函數。原因就是靜態成員函數沒有this指針。
這樣,類中就要有3個靜態成員函數了。
C++中,靜態成員函數的基本創建方法:
類中聲明:
static DWORD WINAPI ThreadFunction(LPVOID lpParam);
類外聲明:
DWORD ClassName::ThreadFunction(LPVOID lpParam){......}
這樣就可以了。
另外因為之前線程也使用了全局變量,所以還需要做靜態成員變量以繼續提供給線程函數使用。
在類中的靜態成員變量使用中需要注意的是,如果代碼中使用了這個靜態成員變量,則改靜態成員變量必須要有類外的一次聲明,形式如下:
VariableType ClassType::Variable;
但是如果你聲明了一個靜態成員變量,但是從沒有用過,那么,完全用不到這一步。不過,聲明了卻沒使用,是不是,有點2?
所以,最好的方法就是,在你創建了一個靜態成員變量后,立即為其做一個類外的聲明。
今天我的代碼就在這卡住了。
另外一個常見的錯誤:明明只有一個函數定義,編譯器卻提示:重復定義。
這個錯誤基本都由於同一個文件被多次(>= 2)包含,而且你的函數定義代碼位於頭文件,而不是專門對應的cpp文件。
這個解決方法,要么把函數包含去掉,要么單獨建了個文件,把函數定義什么的都扔進去。
Over