我看到很多使用CSocket类的文件头都添加了CLASS的关键字,如class CMySocket;那他的作用是什么?为什么直接#include不行呢?
我的示例代码如下,我INCLUDE 了,CLASS了,可是编译器还是报告:error C2079: “CSockThread::ConSock”使用未定义的 class“CClientBlockSock”,这是为什么? 
class CClientBlockSock;
#include "ClientBlockSock.h"
class CSockThread : public CWinThread
{
DECLARE_DYNCREATE(CSockThread)
public:
CSockThread();          
CSockThread(SOCKET socket);
virtual ~CSockThread();
protected:
CClientBlockSock ConSock;
SOCKET m_hSocket;
}

解决方案 »

  1.   

    你把第一行的class CClientBlockSock去掉试一下。
      

  2.   

    #include "ClientBlockSock.h"
    应该就可以了。
      

  3.   

    class CSockThread : public CWinThread
    {
    DECLARE_DYNCREATE(CSockThread)
    public:
    CSockThread();          
    CSockThread(SOCKET socket);
    virtual ~CSockThread();
    protected:
    CClientBlockSock ConSock;
    SOCKET m_hSocket;
    };  <-- 这里看了你的代码,发现你在class定义的最后,没有加上“;”;看看你的ClientBlockSock.h中class的定义,是不是这里的问题?还有,把第一行去掉!!!
      

  4.   

    不好意思,我只是截取了类声明的一部分,把“;”忘记了。
    如果去掉CLASS 语句,将会出现以下错误:
     : error C2146: 语法错误 : 缺少“;”(在标识符“ConSock”的前面)
    error C2501: “CSockThread::CClientBlockSock” : 缺少存储类或类型说明符
     error C2501: “CSockThread::ConSock” : 缺少存储类或类型说明符
      

  5.   

    我把CClientBlockSock ConSock;语句改成:CClientBlockSock* pConSock;
    在后面NEW 一下,编译连接通过。为什么?(去掉CLASS语句仍然会出现错误)
    UP!!!!!!!!
      

  6.   

    你的CClientBlockSock类的定义 会不会也是最后少了';'?
      

  7.   

    如果是
    CClientBlockSock ConSock;
    那么编译器要为Consock分配内存,此时必须知道CClientBlockSock的具体定义,因此要头文件中么用#include "ClientBlockSock.h"。如果用
    CClientBlockSock * Consock;则无需分配内存,头文件中用
    class CClientBlockSock;
    就可以了,但是要在cpp文件中#include "ClientBlockSock.h"你这里只能在头文件中加上
    #include "ClientBlockSock.h"
      

  8.   

    同意GoAround(GoAround)的.
    这两句其实是不用一起存在的.
      

  9.   

    谢谢,我基本上找到原因了。我的类是循环用的。就是类A,B之间互有对象,导致编译器在A、B之间循环调用,无法分配具体内存,所以导致错误。其中一个定义成指针就可以解决问题了。未知对否?
      

  10.   

    你把两个类定义到同一个文件中,然后这样:class C*1;class C*2
    {
    ...
    C*1 c1;
    };class C*1
    {
    ...
    C*2 c2;
    };就可以了。