当类中有静态成员时,以及重复定义原因~
2013-08-15 16:56
246 查看
今天因为需要把一个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
今天专门好好地写一篇博文,免得以后忘了还要百度。
首先我原来的程序主动创建了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
相关文章推荐
- C#&&Java-----C#中和Java中把主函数定义成静态成员函数的原因
- C#--第九周 任务3--定义一个静态成员方法,使用Random实现从一组数中随机抽取n个不重复的数
- 如何在头文件中定义静态数据成员(消除重复定义)
- C#--第九周实验--任务3--定义一个静态成员方法,使用Random实现从一组数中随机抽取n个不重复的数。
- tomcat无法访问静态资源原因以及解决方式
- 问题记录(6)WinSock2.h以及ws2def.h大量重复定义报错
- 全局变量,局部静态变量初始化以及类静态成员变量初始化
- C++中类内成员的定义,声明总结(静态和非静态成员)
- 为什么C++类定义中,数据成员不能被指定为自身类型,但可以是指向自身类型的指针或引用?为什么在类体内可以定义将静态成员声明为其所属类的类型呢 ?
- 浅析PHP的静态成员函数效率更高的原因
- 类的定义以及成员变量与局部变量的区别
- 类模板2——静态成员以及非类型的类模板参数
- C++静态成员函数不能声明为const、volatile、virtual的原因 与 C++的对象模型
- c++ stl 源码解析笔记(一) stl_config 中的模板静态成员定义
- 类的静态数据成员在 类内只能声明,定义和初始化必须在类外
- 自定义C/C++头文件以及头文件重复定义解决
- C++之类内不同的数据成员类型以及方法(静态,const,引用,常量引用)
- 类静态数据成员的定义及初始化
- 类的定义以及成员变量与局部变量的区别
- 静态vector容器成员变量的定义和初始化