• 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++头文件的包含和类的声明等等都应该牵涉到编译器的编译顺序问题,忘大师为我讲解下这是为什么。

      谢谢观众的捧场!

  • 相关阅读:
    用Zend Studio12 导入在workspace中的项目
    PHP 统计中文字符串的长度
    jQuery判断checkbox是否选中的3种方法
    js,jquery获取下拉框选中的option
    HTML与XHTML的区别
    HTML头部
    HTML框架标签
    js的继承
    图片懒加载
    Http请求的gzip压缩
  • 原文地址:https://www.cnblogs.com/hanxi/p/2608068.html
Copyright © 2020-2023  润新知