У меня есть несколько классов в моем приложении, и я бы хотел, чтобы взаимодействие между классами было ограничено базовыми классами. Чтобы сделать это конкретным, сейчас я хочу сделать что-то вроде этого:
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 ++? Может ли кто-нибудь дать мне пример того, как что-то подобное работает, или ссылку на страницу, которая может объяснить, как это сделать?
Благодарю.
Если B_child
конструктор принимает A *
Вы можете передать A_child *
к этому, так как A_child
«является» A
(через публичное наследство). Вы пытались сделать это и обнаружили ошибку?
Можете добавить 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();
}