初学C,有个问题想请教。
在一个工程中,添加俩个类:C1,C2。
在C1.CPP中#INCLUDE “C2.H”.
在C2。CPP中#INCLUDE “C1。H”。
为什么在C1。H中申明C2的对象会出错?

解决方案 »

  1.   

    1)use #ifndef #endif
    2)declare those two class in same file
    for example
    class B;class A
    {
      B * m_pB;
    };class B
    {
      A mA;
    }关键有两点:其中的一个类需要提前声明(forward declaration); 
    被提前声明的类在其被具体定义之前只能声明该类的指针或引用,如上面class A定义中只能声明class B的指针(或引用)。 
    在类的定义结束(编译器在遇到类定义的右花括号之后),用该类来声明类实例对象,或对象指针,引用都是合法的。如上面的类B中定义类A的实例对象就是正确的,因为在此前类A的定义已结束.反之在A中声明B的对象实例就是错误的.
      

  2.   

    jennyvenus(JennyVenus) 讲的太好了。
    在C1.CPP中#INCLUDE “C2.H”.
    在C2。CPP中#INCLUDE “C1。H”。
    这样的循环include, 确实很容易引起问题的。
      

  3.   

    对了,你看看MFC的类中,都有#ifndef #endif
      

  4.   

    jennyvenus(JennyVenus) 讲的很好
    有待学习
      

  5.   

    例如,我在CMYSOCKET中申明一个成员变量CMYDLG *m_dlg;(头文件为MYSOCKET。H)
    而想在CMYDLG中申明成员变量CMYSOCKET m_listen; CNYSOCKET m_connect;(头文件为MYDLG。H)
    那么,该怎样在MYSOCKET。CPP和MYDLG。CPP中使用头文件了?我在MYSOCKET。CPP中#INCLUDE “MYDLG。H”,结果总是出错。
    请各位高手帮小弟一个忙。
      

  6.   

    这样可以,不过有风险。在MySocket.h中,用下面方法声明类CMyDlg,不include mydlg.h:
    class CMyDlg;然后在MySocket.cpp中,#include "MyDlg.h"然后在MyDlg.h中,#include "MySocket.h"
      

  7.   

    staticip说的方法我也试过,对象申明还是会出错。