当类中有静态成员时,以及重复定义原因~
今天因为需要把一个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