首页 > 解决方案 > 如何使用单独文件中的派生类访问朋友函数对象?

问题描述

我有 3 个单独的头文件。A类、B类是A类的派生类。

class A {
public:
    virtual void foo(C ...object...);
};

class B : public A {
public:
    void foo(C ...object...);
};

class C {
public:
    friend class A;
    friend class B;
private:
    A *arr[num][num];
};

arr是二维数组的指针,二维数组里面是B对象。如何从B类的头文件中访问C类对象?可能吗?如果可能的话,“include .h”应该如何分隔头文件和foo函数原型?

标签: c++pointersinheritanceheader-filesvirtual-functions

解决方案


将代码拆分为单独文件的常用方法如下:

  • #pragma once
    class C;
    
    class A {
    public:
        virtual void foo(C c);
    };
    

    A不需要任何类型信息C。成员函数的声明foo不需要完整的类型信息,而是声明,因为该函数需要一个 type 的参数C

  • A.cpp

    #include "A.h"
    #include "C.h"
    
    void A::foo(C c) {}
    

    函数的定义A::foo(C c)需要完整的类型信息C。因此,包含的类定义C

  • 溴化氢

    #pragma once
    #include "A.h"
    
    class C;
    
    class B : public A {
    public:
         void foo(C c) override;
    };
    

    B需要完整的类型信息A才能继承。因此,包含的类定义AC不需要完整的类类型信息(参见 Ah)。

  • B.cpp

    #include "B.h"
    #include "C.h"
    
    void B::foo(C c) {}
    

    与 A.cpp 相同

  • 通道

    #pragma once
    class A;
    
    class C {
    public:
         friend class A;
         friend class B;
    private:
         A *arr[5][5];
    };
    

    C只包含 and 的友元声明AB指向 type 的指针A。朋友声明不需要声明或完整的类型信息。由于所有指向对象的指针都具有相同的大小,因此类的完整类型信息A是不必要的。当指针被取消引用时,它将变得有必要。

所有源文件还包含相应头文件的包含。


推荐阅读