zoukankan      html  css  js  c++  java
  • C++中两个类中互相包含对方对象的指针问题

      前几天很不爽,因为C++中两个类中互相包含对方对象的指针编译时提示某一个类未定义。。。所以我就想啊想,这样也对,我的头文件都有#ifndef的,包含了一次就不能再包含了,以为就实现不了这样的功能,于是就改了设计方案:

    class A
    {
    public:
        A(B* pB):m_pB(pB)
        {
        }
    
    private:
        B* m_pB;
    };
    
    class B
    {
    public:
        B() {}
    private:
        int m_i;
    };

    只在一个类中包含另一个类的指针(算是聚类吧,A不管理m_pB的死活),而在B需要A的属性时通过传递参数进去。这样有些麻烦,但是勉强达到了我的需求。

      今天,又遇到一个必须使用相互包含对象指针的问题,要不然通过参数传来传去麻烦的不得了。所以还是百度了下,结果终于找到了:(c++)两个类相互包含引用的问题里面说的和我需要的差不多,解决方法是一样的。

      文章里面说的很清楚了,我也在这里复述一遍吧,主要解决的就是文件包含的问题:在A的头文件(A.h)中包含B的头文件(B.h),在A的源文件(A.cpp)中包含(A.h),在B的头文件中使用A的声明(class A;)而不是包含A的头文件,然后在B的源文件(B.cpp)中包含A的头文件和B的头文件。代码如下:

    // A.h
    #include "B.h"
    class A
    {
    public:
        A(B* pB):m_pB(pB) {}
        void useB();
    private:
        B* m_pB;
    };
    
    //A.cpp
    #include "A.h"
    void A::useB()
    {
        //do something for m_pB
    }
    
    
    //B.h
    class A;
    class B
    {
    public:
        B(A* pA):m_pA(pA) {}
        void useA();
        
    private:
        A* m_pA;
    };
    
    //B.h
    #include "A.h"
    #include "B.h"
    void B::useA()
    {
        //do something for m_pA
    }

    这样的话B的头文件中不能有使用A的对象指针m_pA的代码,否则会出现“使用了未定义的A”错误。

      最后,问题算是解决了,但是我现在还是有点不明白的,这C++头文件的包含和类的声明等等都应该牵涉到编译器的编译顺序问题,忘大师为我讲解下这是为什么。

      谢谢观众的捧场!

  • 相关阅读:
    Windows下临界区的使用CRITICAL_SECTION
    MFC中消息映射的实现
    Oracle中提供的事件触发机制
    CreateEvent()详解
    内核参数优化之2-1 tcp/ip 标志位报文解析
    内核参数优化之1 keepalive解析
    python之7-3对象的信息/方法获取
    python之7-2类的继承与多态
    python之7-1类
    python之6-3嵌套函数
  • 原文地址:https://www.cnblogs.com/hanxi/p/2608068.html
Copyright © 2011-2022 走看看