Передать родительский класс в конструктор другого класса

У меня есть несколько классов в моем приложении, и я бы хотел, чтобы взаимодействие между классами было ограничено базовыми классами. Чтобы сделать это конкретным, сейчас я хочу сделать что-то вроде этого:

    class A
{
data

public:
void method();
};

class A_child : public A
{
//stuff
};

class B
{
public:
B(class A *a);
};
class B_child : public B
{
public:
B_child(class A *a);
B_method(); // does some stuff with data in A and B.
};

Хотя на самом деле каждый из классов имеет отдельные заголовочные файлы, так что есть много включений туда и обратно …

В файле cpp для A_child я хочу иметь возможность использовать B_child (или B, в этом отношении). Но я не знаю, как избежать необходимости называть что-то вроде

void A_child::method()
{
// stuff

B_child *example_B;
example_B = new B_child(this);
example_B->B_method();

// more stuff
}

Это не должно быть

example_B = new B_child(this);

обязательно, он просто должен иметь некоторый способ передачи родительского класса A_child в конструктор B или B_child.

То, что я хотел бы сделать, это избежать определения B_child как что-то вроде:

   class B_child : public B
{
public:
B_child(class A_child *a_child);
B_method();
};

вместо того, что я имею выше, потому что это, кажется, подразумевает, что B_child должен работать с A_child, а не с A. Хотя это правда, в материале, который B или B_child работает, нет ничего, что требует A_child — данные в A, не A_child, достаточно.

Я предполагаю, что есть способ сделать это в C ++? Может ли кто-нибудь дать мне пример того, как что-то подобное работает, или ссылку на страницу, которая может объяснить, как это сделать?

Благодарю.

0

Решение

Если B_child конструктор принимает A *Вы можете передать A_child * к этому, так как A_child «является» A (через публичное наследство). Вы пытались сделать это и обнаружили ошибку?

0

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

Можете добавить parent поле в A учебный класс:

class A {
B_child* parent;
public:
void setParent(B_child* p) {
parent = p;
}
}

следующий в B_child конструктор:

B_child::B_child(A* a) {
// stuff
a->setParent(this);
}

тогда вы получите доступ к parent объект внутри A_child метод:

void A_child::method() {
if(parent)
parent->B_method();
}
0

По вопросам рекламы [email protected]