如何使用单独文件中的派生类访问友元函数对象

How do I access the friend function objects with my derived classes in seperate files?

本文关键字:访问 友元 函数 对象 派生 何使用 单独 文件      更新时间:2023-10-16

我有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是2D数组的指针。二维阵列的内部填充了B个对象。如何从B类的头文件访问C类对象?有可能吗?如果可能的话;包括.h";将头文件和foo函数原型分离?

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

  • A.h

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

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

  • A.cpp

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

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

  • B.h

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

    B需要A的完整类型信息才能进行继承。因此包含了A的类定义。不需要C类的完整类型信息(见A.h(。

  • B.cpp

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

    与A.cpp 中相同

  • C.h

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

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

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