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

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

我有 3 个单独的头文件。 ClassA,ClassB导出A和Class.

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的指针array.The 2D数组里面填充了B objects.How 我可以从class的头文件中访问C class对象吗乙?可以吗?如果可以,“include.h”应该如何分隔头文件和foo函数原型?

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

  • A.h

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

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

    类型的参数
  • A.cpp

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

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

  • B.h

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

    Class B 需要完整的 A 类型信息才能继承。因此,包含 A 的 class 定义。 class 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];
    };
    

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

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