CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  基础类

请帮忙分析这个语法错误!

楼主eling(forU)2001-09-17 17:30:57 在 VC/MFC / 基础类 提问

在clientsocket.h中DECLARE_DYNCREATE(CClientSocet);出错为:  
  clientsocket.h(17)   :   see   declaration   of   '_GetBaseClass'  
  clientsocket.h(15)   :   see   declaration   of   'CClientSocket'  
  在ClientSocket.cpp中IMPLEMENT_DYNAMIC(CClientSocket,CSocket);出错为;  
  '_GetBaseClass'   :   cannot   access   protected   member   declared   in   class   'CClientSocket'  
  'classCClientSocket'   :   is   not   a   member   of   'CClientSocket'  
  请问DECLARE_DYNCREATE(CClientSocet);和IMPLEMENT_DYNAMIC(CClientSocket,CSocket);是什么作用,又为什么出错?  
  问题点数:20、回复次数:21Top

1 楼jiangping_zhu(娜可露露之风之刃)回复于 2001-09-17 17:49:42 得分 0

宏是声明一些动态创建需要的函数和成员变量,错误为你访问了该类的保护成员_GetBaseClass成员。Top

2 楼SingleStar(赵云)回复于 2001-09-17 17:59:15 得分 0

和RTTI差不多吧,就是Runtime   Type   Information,动态类型识别,可以看看侯捷《深入浅出mfc》。查mfc原代码也可以Top

3 楼eling(forU)回复于 2001-09-17 17:59:42 得分 0

那怎么把它改正呢?Top

4 楼sam1111(化神奇为腐朽)回复于 2001-09-17 18:02:25 得分 0

这两个宏的作用是,使由CObject类派生的类能够被动态创建。Top

5 楼eling(forU)回复于 2001-09-17 18:10:55 得分 0

哦,明白了,可问题出在那里呢?Top

6 楼eling(forU)回复于 2001-09-18 09:05:41 得分 0

拜托各位高手帮帮忙吧,我实在是没办法了!Top

7 楼eling(forU)回复于 2001-09-18 09:29:12 得分 0

不会吧,没有人知道吗!  
  这到底该怎么该!!!???Top

8 楼SingleStar(赵云)回复于 2001-09-18 09:54:56 得分 0

查mfc原代码  
  #define   DECLARE_DYNCREATE(class_name)   DECLARE_DYNAMIC(class_name)   static   CObject*   PASCAL   CreateObject();  
  #define   DECLARE_DYNAMIC(class_name)   public:   static   const   AFX_DATA   CRuntimeClass   class##class_name;   virtual   CRuntimeClass*   GetRuntimeClass()   const;    
   
  #define   IMPLEMENT_DYNAMIC(class_name,   base_class_name)   IMPLEMENT_RUNTIMECLASS(class_name,   base_class_name,   0xFFFF,   NULL)  
  #define   IMPLEMENT_RUNTIMECLASS(class_name,   base_class_name,   wSchema,   pfnNew)   AFX_COMDAT   const   AFX_DATADEF   CRuntimeClass   class_name::class##class_name   =   {   #class_name,   sizeof(class   class_name),   wSchema,   pfnNew,   RUNTIME_CLASS(base_class_name),   NULL   };   CRuntimeClass*   class_name::GetRuntimeClass()   const   {   return   RUNTIME_CLASS(class_name);   }   #define   RUNTIME_CLASS(class_name)   ((CRuntimeClass*)(&class_name::class##class_name))  
   
  把IMPLEMENT_DYNAMIC改成IMPLEMENT_DYNCREATE就应该ok了。  
  Top

9 楼Bottol(亲爱的:)回复于 2001-09-18 10:02:40 得分 0

重建此工程,或重建CClientSocket类,IMPLEMENT_DYNCREATE与DECLARE_DYNCREATE对应,但写成IMPLEMENT_DYNAMIC变译时应该不会报错。Top

10 楼eling(forU)回复于 2001-09-18 10:15:43 得分 0

我是改成IMPLEMENT_DYNCREATE,可还是有错!Top

11 楼eling(forU)回复于 2001-09-18 10:26:48 得分 0

重建CClientSocket类是什么意思?我改成IMPLEMENT_DYNAMIC也还是有错!?Top

12 楼SingleStar(赵云)回复于 2001-09-18 10:45:33 得分 0

用向导生成的工程么?把clientsocket.h和clientsocket.cpp贴出来看看吧。Top

13 楼Bottol(亲爱的:)回复于 2001-09-18 10:46:04 得分 10

重建CClientSocket类就是说把他Delete掉后重新再建过。  
  IMPLEMENT_DYNAMIC与IMPLEMENT_DYNCREATE是两个层次上的宏,IMPLEMENT_DYNAMIC用来是程序具有运行时能的动态获取程序中使用的类的信息,IMPLEMENT_DYNCREATE宏就是在IMPLEMENT_DYNAMIC的基础之上加入了动态创建类的功能,IMPLEMENT_DYNCREATE与IMPLEMENT_DYNAMIC配对在编译时不会报错,但会使程序失去动态创建CCliengSocket类的能力。Top

14 楼eling(forU)回复于 2001-09-18 10:57:04 得分 0

#if   !defined(AFX_CLIENTSOCKET_H__BAB0BE80_A92F_11D5_9436_0050FC2C2AE7__INCLUDED_)  
  #define   AFX_CLIENTSOCKET_H__BAB0BE80_A92F_11D5_9436_0050FC2C2AE7__INCLUDED_  
   
  #if   _MSC_VER   >   1000  
  #pragma   once  
  #endif   //   _MSC_VER   >   1000  
  //   ClientSocket.h   :   header   file  
  //  
  #include   "Afx.h"  
       
  class   CMsg;  
  class   CChatServerDlg;  
   
  /////////////////////////////////////////////////////////////////////////////  
  //   CClientSocket   command   target  
   
  class   CClientSocket   :   public   CSocket  
  {  
  DECLARE_DYNAMIC(CClientSocet);  
  //   Attributes  
  public:  
   
  //   Operations  
  public:  
  CClientSocket(CChatServerDlg*   pDlg);  
  int   m_nMsgCount;  
  CSocketFile*   m_pFile;  
  CArchive*   m_pArchiveIn;  
  CArchive*   m_pArchiveOut;  
  CChatServerDlg*   m_pDlg;  
  BOOL   IsAborted() {return   m_pArchiveOut==NULL;}  
  public:  
  void   Initialize();  
  void   Abort();  
  void   SendMessage(CMsg*   pMsg);  
  void   ReceiveMessage(CMsg*   pMsg);  
  protected:  
  virtual   void   OnReceive(int   nErrorCode);  
  public:  
  virtual   ~CClientSocket();  
           
  //   Overrides  
  public:  
  //   ClassWizard   generated   virtual   function   overrides  
  //{{AFX_VIRTUAL(CClientSocket)  
   
  //}}AFX_VIRTUAL  
   
  //   Generated   message   map   functions  
  //{{AFX_MSG(CClientSocket)  
  //   NOTE   -   the   ClassWizard   will   add   and   remove   member   functions   here.  
  //}}AFX_MSG  
   
  //   Implementation  
  protected:  
  };  
   
  /////////////////////////////////////////////////////////////////////////////  
   
  //{{AFX_INSERT_LOCATION}}  
  //   Microsoft   Visual   C++   will   insert   additional   declarations   immediately   before   the   previous   line.  
   
  #endif   //   !defined(AFX_CLIENTSOCKET_H__BAB0BE80_A92F_11D5_9436_0050FC2C2AE7__INCLUDED_)  
  //   ClientSocket.cpp   :   implementation   file  
  //  
   
  #include   "stdafx.h"  
  #include   "ChatServer.h"  
  #include   "ClientSocket.h"  
  #include   "Msg.h"  
  #include   "ChatServerDlg.h"  
  #ifdef   _DEBUG  
  #define   new   DEBUG_NEW  
  #undef   THIS_FILE  
  static   char   THIS_FILE[]   =   __FILE__;  
  #endif  
   
  /////////////////////////////////////////////////////////////////////////////  
  //   CClientSocket  
   
  CClientSocket::CClientSocket(CChatServerDlg*   pDlg)  
  {  
        m_pDlg=pDlg;  
        m_nMsgCount=0;  
        m_pFile=NULL;  
        m_pArchiveIn=NULL;  
        m_pArchiveOut=NULL;  
  }  
   
  CClientSocket::~CClientSocket()  
  {  
  if(m_pArchiveOut!=NULL)  
  delete   m_pArchiveOut;  
  if(m_pArchiveIn!=NULL)  
  delete   m_pArchiveIn;  
  if(m_pFile!=NULL)  
  delete   m_pFile;  
  }  
  void   CClientSocket::Initialize()  
  {  
  // m_pFile=new   CSoketFile(this);  
  m_pArchiveIn=new   CArchive(m_pFile,CArchive::load);  
  m_pArchiveOut=new   CArchive(m_pFile,CArchive::store);  
  }  
  void   CClientSocket::Abort()  
  {  
  if(m_pArchiveOut!=NULL)  
  {  
  m_pArchiveOut->Abort();  
  delete   m_pArchiveOut;  
  m_pArchiveOut=NULL;  
  }  
  }  
  void   CClientSocket::SendMessage(CMsg*   pMsg)  
  {  
  if(m_pArchiveOut!=NULL)  
  {  
  pMsg->Serialize(*m_pArchiveOut);  
  m_pArchiveOut->Flush();  
  }  
  }  
  void   CClientSocket::ReceiveMessage(CMsg*   pMsg)  
  {  
  pMsg->Serialize(*m_pArchiveIn);  
  }  
  void   CClientSocket::OnReceive(int   nErrorCode)  
  {  
  CSocket::OnReceive(nErrorCode);  
  m_pDlg->OnReceive(this);  
  }  
   
   
   
  //   Do   not   edit   the   following   lines,   which   are   needed   by   ClassWizard.  
  #if   0  
  BEGIN_MESSAGE_MAP(CClientSocket,   CSocket)  
  //{{AFX_MSG_MAP(CClientSocket)  
  //}}AFX_MSG_MAP  
  END_MESSAGE_MAP()  
  #endif //   0  
   
  IMPLEMENT_DYNAMIC(CClientSocket,CSocket);  
  /////////////////////////////////////////////////////////////////////////////  
  //   CClientSocket   member   functions  
   
   
   
   
  Top

15 楼eling(forU)回复于 2001-09-18 11:00:36 得分 0

那样delede掉不是和现在的一样吗!?  
  动态创建到底是个什么概念?Top

16 楼Bottol(亲爱的:)回复于 2001-09-18 11:12:33 得分 5

在VC中删除一个玩应后再建常常会有不同的结果(也许是我的D版VC有问题),我刚才试了一下,第一次也出现你的问题,但我重新建过后又没问题了。  
  动态创建是说你的程序在运行的时候能够在需要的时候创建类,而不必在程序开始时就把收有的类全部放到内存中,等着别人来调用。  
  把你的IMPLEMENT_DYNAMIC(CClientSocket,CSocket);DECLARE_DYNAMIC(CClientSocet);后面的“;”去掉。Top

17 楼eling(forU)回复于 2001-09-18 11:19:06 得分 0

哦,很感谢你的热心帮助,我试试看!Top

18 楼SingleStar(赵云)回复于 2001-09-18 11:25:02 得分 0

包含了AFXSOCK.H?Top

19 楼SingleStar(赵云)回复于 2001-09-18 11:27:10 得分 5

我最后的提议就是改成这样:  
  //DECLARE_DYNAMIC(CClientSocet);  
  //IMPLEMENT_DYNAMIC(CClientSocket,CSocket);  
  不用这个功能,一般来说也可以的。  
   
  Top

20 楼eling(forU)回复于 2001-09-18 11:34:26 得分 0

包含了AFXSOCK.H也不行!  
  如果//DECLARE_DYNAMIC(CClientSocet);  
  //IMPLEMENT_DYNAMIC(CClientSocket,CSocket);  
  编译没错但链接时出错如下:inking...  
  ListeningSocket.obj   :   error   LNK2001:   unresolved   external   symbol   "public:   virtual   struct   CRuntimeClass   *   __thiscall   CListeningSocket::GetRuntimeClass(void)const   "   (?GetRuntimeClass@CListeningSocket@@UBEPAUCRuntimeClass@@XZ)  
  Msg.obj   :   error   LNK2001:   unresolved   external   symbol   "public:   virtual   struct   CRuntimeClass   *   __thiscall   CMsg::GetRuntimeClass(void)const   "   (?GetRuntimeClass@CMsg@@UBEPAUCRuntimeClass@@XZ)  
  PorDlg.obj   :   error   LNK2001:   unresolved   external   symbol   "protected:   void   __thiscall   CPortDlg::OnStopServer(void)"   (?OnStopServer@CPortDlg@@IAEXXZ)  
  Debug/ChatServer.exe   :   fatal   error   LNK1120:   3   unresolved   externals  
  Error   executing   link.exe.  
   
  ChatServer.exe   -   4   error(s),   0   warning(s)  
   
  Top

21 楼eling(forU)回复于 2001-09-18 16:12:06 得分 0

谢谢各位!Top

相关问题

  • 请各位帮我分析一下下边的语法错误!
  • 请检查语法错误
  • 语法错误???
  • 语法错误
  • 语法错误
  • 语法错误???
  • 请问那有语法错误呢??
  • 语法分析!
  • FlowControl语法错误
  • insert into语法错误

关键词

  • cclientsocket
  • parchiveout
  • cclientsocet
  • parchivein
  • clientsocket
  • dynamic
  • dyncreate
  • implement
  • cmsg
  • afx

得分解答快速导航

  • 帖主:eling
  • Bottol
  • Bottol
  • SingleStar

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo