當類中有靜態成員時,以及重復定義原因~


今天因為需要把一個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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM