Как мне получить доступ к объектам функций друга с моими производными классами в отдельных файлах? - PullRequest
0 голосов
/ 11 июля 2020

У меня есть 3 отдельных файла заголовков. Класс A, класс B является производным от 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 - указатель на двумерный массив. Внутри двумерного массива находятся объекты B. Как я могу получить доступ к объекту класса C из заголовочный файл класса B? Возможно ли? Каким образом "include .h" разделяет файлы заголовков и прототип функции foo?

1 Ответ

0 голосов
/ 11 июля 2020

Обычный способ разбить ваш код на отдельные файлы:

  • Ah

    #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.

  • Bh

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

    Класс B требует полной информации о типе A для наследования. Поэтому включено определение класса A. Полная информация о типе класса C не требуется (см. Ah).

  • 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 просто содержит объявления друзей A и B и указатель на тип A . Объявление друга не требует объявления или полной информации о типе. Поскольку все указатели на объекты имеют одинаковый размер, полная информация о типе для класса A не требуется. Это станет необходимым при разыменовании указателя.

Все исходные файлы также содержат включение соответствующего файла заголовка.

...