Рассмотрим этот пример кода:
class Base
{
public:
Base() {}
};
class Derived1 : public Base
{
public:
Derived1() : Base() {}
};
class Derived2 : public Base
{
public:
Derived2() : Base() {}
};
Есть ли что-нибудь, чтобы заставить Derived1 иметь - Derived2 и Derived2 - Derived1?
Лучшим решением будет использование третьего класса, который имеет эти два объекта. Но в случае необходимости высокой производительности?
Примером может быть двухстороннее клиент-серверное приложение.
EDIT: Подумайте, что это просто сводный пример. В реальном коде каждый из трех классов мог вызывать исключение; Однако я убедился, что код является безопасным для исключений.
Вы можете выполнить связь " has-a " с декларацией forward, которая в основном говорит "этот класс существует, он еще не объявлен",
#include <iostream>
using namespace std;
class Base
{
public:
Base() {}
};
// Forward declaration
class Derived1;
class Derived2 : public Base
{
friend class Derived1;
public:
Derived2() : Base() {}
private:
Derived1 *ptr;
};
class Derived1 : public Base
{
public:
Derived1(Derived2& obj) : Base(), ptr(&obj) {
obj.ptr = this;
}
private:
Derived2 *ptr;
};
int main() {
Derived2 obj2;
Derived1 obj1(obj2);
return 0;
}
Таким образом, два класса могут общаться друг с другом. Обратите внимание на частные указатели и инициализацию в конструкторе. С помощью объявления "friend" один класс может модифицировать частные члены другого класса.
Derived1
и 2 Derived2
(один для клиентского приложения, а другой для сервера). Не могут ли ptr
быть инициализированы в конструкторе, чтобы сделать их private
?
Каждый класс может содержать указатель :?
class Derived1
Derived2 *p_d2;
class Derived2
Derived1 *p_d1;