объект — классы C ++, использующие друг друга

У меня есть два класса, допустим, класс A и класс B. Моя цель состоит в том, чтобы оба класса использовали функции друг друга. Проблема в том, что многофайловая структура включения не позволяет мне это делать. Вот что я пытаюсь сделать:

#file A.h

Class A{
public:
int GetInfo();

private:
B * ptrToB;
};

#file B.h

Class B{
public:
int getStuff();
private:
A * ptrToA;
};

Моя цель — чтобы метод класса А мог вызывать ptrToB->getStuff() и для метода класса B, чтобы иметь возможность вызывать ptrToA->getInfo()

Это возможно? Как так? Если нет, то почему нет?

2

Решение

Может быть, с использованием предварительных деклараций?

#file A.h

#ifndef ACLASS_H
#define ACLASS_H

Class B;

Class A{
public:
int GetInfo();

private:
B * ptrToB;
};

#endif

Затем в файле CPP.

#file A.cpp

#include "B.h"
A::A() : ptrToB(0)
{
// Somehow get B
}

int A::GetInfo()
{
// Return whatever you need in here.
}

То же самое будет сделано для файлов классов B и H и файлов CPP.

Прямое определение позволяет компилятору распознавать тип без необходимости его явного определения. Если у вас есть ссылка на B в классе A, вы должны будете включить заголовок B.

Поскольку вы используете указатель для доступа к B, компилятору не нужно знать внутренние данные, пока вы не получите к ним доступ (внутри файла CPP).

// Would need the header because we must know
// the size of B at compile time.
class B;
class A
{
B theB;
}// Only need forward declaration because a
// pointers size is always known by the compiler
class B;
class A
{
B * bPointer;
}
4

Другие решения

Просто добавьте предварительное объявление в файл A.h, чтобы компилятор знал, что B* это указатель на класс, который вы определите позже:

class B;

Затем определите ваш class A и включить Б. ч после этого. Таким образом, любой, включая A.h, получит оба class A а также class B определены.

В B.h просто включите A.h в начале. Таким образом, любой, включая B.h, также будет иметь class A а также class B определены.

Когда вы определите свои функции в связанных файлах .cpp, у вас будут доступны оба класса, и вы сможете просто писать свои функции, как хотите.

Эта проблема называется взаимная рекурсия.

2

Вы можете использовать предварительное объявление, чтобы сломать зависимости:

#file A.h

Class A{
public:
int GetInfo();

private:
B * ptrToB;
};

#file B.h
struct A;
Class B{
public:
int getStuff();
private:
A * ptrToA;
};

Тогда вы можете включить A.h в B.cpp и B.h в A.cpp без проблем.

2
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector