为什么我用自己定义的类在另一个类不能声明使用???

时间:2022-12-06 20:12:05
我自己定义 一个类CMySocket如下:
#pragma once

// CMySocket 命令目标

class CMySocket : public CSocket
{
public:
CMySocket();
virtual ~CMySocket();
    virtual void OnAccept(int nErrorCode);
    virtual void OnClose(int nErrorCode);
    virtual void OnReceive(int nErrorCode);
    virtual void OnSend(int nErrorCode);

    //
private:
    //CListenDlg ServerDlg;
    int n_CurrentNum;
public:
    //void SetParent(CListenDlg* ServerDlg, int CurrentNum);

};
这个也是我定义的类CListenDlg,不过这个类是基本对话框的,
为什么不能使用这个类来定义对象呢???

 //CListenDlg ServerDlg;

提示错误是:

1>d:\我的文档\visual studio 2008\projects\serversocket\serversocket\mysocket.h(16) : error C2146: 语法错误 : 缺少“;”(在标识符“ServerDlg”的前面)
1>d:\我的文档\visual studio 2008\projects\serversocket\serversocket\mysocket.h(16) : error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
1>d:\我的文档\visual studio 2008\projects\serversocket\serversocket\mysocket.h(16) : error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
1>MySocket.cpp
1>d:\我的文档\visual studio 2008\projects\serversocket\serversocket\mysocket.h(16) : error C2146: 语法错误 : 缺少“;”(在标识符“ServerDlg”的前面)
1>d:\我的文档\visual studio 2008\projects\serversocket\serversocket\mysocket.h(16) : error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
1>d:\我的文档\visual studio 2008\projects\serversocket\serversocket\mysocket.h(16) : error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
1>ServerSocket.cpp
1>ServerSocketDlg.cpp
1>d:\我的文档\visual studio 2008\projects\serversocket\serversocket\mysocket.h(16) : error C2146: 语法错误 : 缺少“;”(在标识符“ServerDlg”的前面)
1>d:\我的文档\visual studio 2008\projects\serversocket\serversocket\mysocket.h(16) : error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
1>d:\我的文档\visual studio 2008\projects\serversocket\serversocket\mysocket.h(16) : error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
1>正在生成代码...
1>生成日志保存在“file://d:\我的文档\Visual Studio 2008\Projects\ServerSocket\ServerSocket\Debug\BuildLog.htm”
1>ServerSocket - 9 个错误,0 个警告
========== 全部重新生成: 成功 0 个,失败 1 个,跳过 0 个 ==========

22 个解决方案

#1


你都没把类CSocket的头文件包含进来

#2


急用的,主高手帮忙.....谢谢

#3


我试过了,把 #include "CListenDlg.h" 包含也一样 同样出错 

#4


#pragma once

#include "ListenDlg.h"
// CMySocket 命令目标

class CMySocket : public CSocket
{
public:
CMySocket();
virtual ~CMySocket();
    virtual void OnAccept(int nErrorCode);
    virtual void OnClose(int nErrorCode);
    virtual void OnReceive(int nErrorCode);
    virtual void OnSend(int nErrorCode);

private:
    CListenDlg ServerDlg;
    int n_CurrentNum;
public:
    //void SetParent(CListenDlg* ServerDlg, int CurrentNum);

};


错误提示:
1>d:\我的文档\visual studio 2008\projects\serversocket\serversocket\mysocket.h(17) : error C2146: 语法错误 : 缺少“;”(在标识符“ServerDlg”的前面)
1>d:\我的文档\visual studio 2008\projects\serversocket\serversocket\mysocket.h(17) : error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
1>d:\我的文档\visual studio 2008\projects\serversocket\serversocket\mysocket.h(17) : error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
1>MySocket.cpp
1>ServerSocketDlg.cpp
1>d:\我的文档\visual studio 2008\projects\serversocket\serversocket\mysocket.h(17) : error C2146: 语法错误 : 缺少“;”(在标识符“ServerDlg”的前面)
1>d:\我的文档\visual studio 2008\projects\serversocket\serversocket\mysocket.h(17) : error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
1>d:\我的文档\visual studio 2008\projects\serversocket\serversocket\mysocket.h(17) : error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
1>正在生成代码...

#5


CListenDlg本身没有编译通过,有错误;
你不能用一个有错的类去声明变量.

#6


不可能吧,我把CListenDlg ServerDlg; 注释掉,是可以运行的

#7


你这可能是相互包含问题,即A类中用到B类,B类中用到A类。

#8


可我有 #pragma once 啊,这个不会有重复啊

#9


引用 7 楼 ljz888666555 的回复:
你这可能是相互包含问题,即A类中用到B类,B类中用到A类。


说清楚点,我还不是很明白 ,那我想A 和B都可以相互使用,好怎么办??

#10


重复定义

#11


顶,没有看懂。

#12


那现在看懂了没有...可这个#pragma once 怎么不起作用呢??????

#13


引用 7 楼 ljz888666555 的回复:
你这可能是相互包含问题,即A类中用到B类,B类中用到A类。


说明 一下,这个高手的说法是对的,问题已经得到了觖决,就是不明白为什么
#pragma once 不起作用

#14


先谢谢各位 啦

#15


mysocket.h(16) : error C2146: 语法错误 : 缺少“;”(在标识符“ServerDlg”的前面) 

编译器认为这里有个类型没有声明

#16


引用 12 楼 ekisstherain 的回复:
那现在看懂了没有...可这个#pragma once 怎么不起作用呢??????


相互引用, 仅限于头文件中的声明;//不能使用定义
要使用, 需要再在cpp文件中包含;

//a.h
class CListenDlg;
class CMySocket
{
  CListenDlg dlg;
  void function()
  {dlg.open();}//wrong
}
//a.cpp
#include "ListenDlg.h"
void function()
{
dlg.open();//right
}
//b.h
class CMySocket;
class CListenDlg
{
//同上
}

#17


引用 16 楼 luoqi 的回复:
引用 12 楼 ekisstherain 的回复:
那现在看懂了没有...可这个#pragma once 怎么不起作用呢??????


相互引用, 仅限于头文件中的声明;//不能使用定义
要使用, 需要再在cpp文件中包含;

//a.h
class CListenDlg;
class CMySocket
{
  CListenDlg dlg;
  void function()
  {dlg.open();}//wrong
}
//a.cpp
#include "ListenDlg.h"
void function()
{
dlg.open();//right
}
//b.h
class CMySocket;
class CListenDlg
{
//同上
}


问题是我要在头文件中就要互相使用啊.
就是在类里面的定义使用另一个类的定义
这样子就不行,就是所说的重定义

#18


头文件卫士
#ifndef
#define
#endif

#19


我以前也遇到!!.h改成.cpp就行了!!!

#20


都先声明下

#21


 不要把对象作为成员 用对象指针作为成员,在构造里面new出来
构造函数写在类声明外面, 写在另外一个class的声明后面

#22


引用 17 楼 ekisstherain 的回复:
引用 16 楼 luoqi 的回复:
引用 12 楼 ekisstherain 的回复:
那现在看懂了没有...可这个#pragma once 怎么不起作用呢??????


相互引用, 仅限于头文件中的声明;//不能使用定义
要使用, 需要再在cpp文件中包含;

//a.h
class CListenDlg;
class CMySocket
{
  CListenDlg dlg;
  void function()
  {dlg.open();}//wrong
}
//a.cpp
#include "ListenDlg.h"
void function()
{
dlg.open();//right
}
//b.h
class CMySocket;
class CListenDlg
{
//同上
}


问题是我要在头文件中就要互相使用啊.
就是在类里面的定义使用另一个类的定义
这样子就不行,就是所说的重定义


不可以头文件中,互相使用!!!!!!!
这是规则!!

#1


你都没把类CSocket的头文件包含进来

#2


急用的,主高手帮忙.....谢谢

#3


我试过了,把 #include "CListenDlg.h" 包含也一样 同样出错 

#4


#pragma once

#include "ListenDlg.h"
// CMySocket 命令目标

class CMySocket : public CSocket
{
public:
CMySocket();
virtual ~CMySocket();
    virtual void OnAccept(int nErrorCode);
    virtual void OnClose(int nErrorCode);
    virtual void OnReceive(int nErrorCode);
    virtual void OnSend(int nErrorCode);

private:
    CListenDlg ServerDlg;
    int n_CurrentNum;
public:
    //void SetParent(CListenDlg* ServerDlg, int CurrentNum);

};


错误提示:
1>d:\我的文档\visual studio 2008\projects\serversocket\serversocket\mysocket.h(17) : error C2146: 语法错误 : 缺少“;”(在标识符“ServerDlg”的前面)
1>d:\我的文档\visual studio 2008\projects\serversocket\serversocket\mysocket.h(17) : error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
1>d:\我的文档\visual studio 2008\projects\serversocket\serversocket\mysocket.h(17) : error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
1>MySocket.cpp
1>ServerSocketDlg.cpp
1>d:\我的文档\visual studio 2008\projects\serversocket\serversocket\mysocket.h(17) : error C2146: 语法错误 : 缺少“;”(在标识符“ServerDlg”的前面)
1>d:\我的文档\visual studio 2008\projects\serversocket\serversocket\mysocket.h(17) : error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
1>d:\我的文档\visual studio 2008\projects\serversocket\serversocket\mysocket.h(17) : error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
1>正在生成代码...

#5


CListenDlg本身没有编译通过,有错误;
你不能用一个有错的类去声明变量.

#6


不可能吧,我把CListenDlg ServerDlg; 注释掉,是可以运行的

#7


你这可能是相互包含问题,即A类中用到B类,B类中用到A类。

#8


可我有 #pragma once 啊,这个不会有重复啊

#9


引用 7 楼 ljz888666555 的回复:
你这可能是相互包含问题,即A类中用到B类,B类中用到A类。


说清楚点,我还不是很明白 ,那我想A 和B都可以相互使用,好怎么办??

#10


重复定义

#11


顶,没有看懂。

#12


那现在看懂了没有...可这个#pragma once 怎么不起作用呢??????

#13


引用 7 楼 ljz888666555 的回复:
你这可能是相互包含问题,即A类中用到B类,B类中用到A类。


说明 一下,这个高手的说法是对的,问题已经得到了觖决,就是不明白为什么
#pragma once 不起作用

#14


先谢谢各位 啦

#15


mysocket.h(16) : error C2146: 语法错误 : 缺少“;”(在标识符“ServerDlg”的前面) 

编译器认为这里有个类型没有声明

#16


引用 12 楼 ekisstherain 的回复:
那现在看懂了没有...可这个#pragma once 怎么不起作用呢??????


相互引用, 仅限于头文件中的声明;//不能使用定义
要使用, 需要再在cpp文件中包含;

//a.h
class CListenDlg;
class CMySocket
{
  CListenDlg dlg;
  void function()
  {dlg.open();}//wrong
}
//a.cpp
#include "ListenDlg.h"
void function()
{
dlg.open();//right
}
//b.h
class CMySocket;
class CListenDlg
{
//同上
}

#17


引用 16 楼 luoqi 的回复:
引用 12 楼 ekisstherain 的回复:
那现在看懂了没有...可这个#pragma once 怎么不起作用呢??????


相互引用, 仅限于头文件中的声明;//不能使用定义
要使用, 需要再在cpp文件中包含;

//a.h
class CListenDlg;
class CMySocket
{
  CListenDlg dlg;
  void function()
  {dlg.open();}//wrong
}
//a.cpp
#include "ListenDlg.h"
void function()
{
dlg.open();//right
}
//b.h
class CMySocket;
class CListenDlg
{
//同上
}


问题是我要在头文件中就要互相使用啊.
就是在类里面的定义使用另一个类的定义
这样子就不行,就是所说的重定义

#18


头文件卫士
#ifndef
#define
#endif

#19


我以前也遇到!!.h改成.cpp就行了!!!

#20


都先声明下

#21


 不要把对象作为成员 用对象指针作为成员,在构造里面new出来
构造函数写在类声明外面, 写在另外一个class的声明后面

#22


引用 17 楼 ekisstherain 的回复:
引用 16 楼 luoqi 的回复:
引用 12 楼 ekisstherain 的回复:
那现在看懂了没有...可这个#pragma once 怎么不起作用呢??????


相互引用, 仅限于头文件中的声明;//不能使用定义
要使用, 需要再在cpp文件中包含;

//a.h
class CListenDlg;
class CMySocket
{
  CListenDlg dlg;
  void function()
  {dlg.open();}//wrong
}
//a.cpp
#include "ListenDlg.h"
void function()
{
dlg.open();//right
}
//b.h
class CMySocket;
class CListenDlg
{
//同上
}


问题是我要在头文件中就要互相使用啊.
就是在类里面的定义使用另一个类的定义
这样子就不行,就是所说的重定义


不可以头文件中,互相使用!!!!!!!
这是规则!!