Классы, составленные друг другом

0

Рассмотрим этот пример кода:

class Base
{
public:
    Base() {}      
};

class Derived1 : public Base
{
public:
    Derived1() : Base() {}
};

class Derived2 : public Base
{
public:
    Derived2() : Base() {}

};

Есть ли что-нибудь, чтобы заставить Derived1 иметь - Derived2 и Derived2 - Derived1?
Лучшим решением будет использование третьего класса, который имеет эти два объекта. Но в случае необходимости высокой производительности?

Примером может быть двухстороннее клиент-серверное приложение.

EDIT: Подумайте, что это просто сводный пример. В реальном коде каждый из трех классов мог вызывать исключение; Однако я убедился, что код является безопасным для исключений.

  • 0
    Пожалуйста, будьте более конкретны в отношении того, что вы пытаетесь достичь.
  • 0
    Почему четвертый объект снижает производительность?
Показать ещё 8 комментариев
Теги:
oop
inheritance
composition

2 ответа

3
Лучший ответ

Вы можете выполнить связь " 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;
}

http://ideone.com/RVU8AR

Таким образом, два класса могут общаться друг с другом. Обратите внимание на частные указатели и инициализацию в конструкторе. С помощью объявления "friend" один класс может модифицировать частные члены другого класса.

  • 0
    Я не знаю, использовать ли указатели или третий класс. Потому что мне нужно было бы сделать 2 Derived1 и 2 Derived2 (один для клиентского приложения, а другой для сервера). Не могут ли ptr быть инициализированы в конструкторе, чтобы сделать их private ?
  • 0
    конечно, вы можете сделать это. Хотя один элемент должен существовать, прежде чем его указатель может быть взят. Некоторые хитрости могут решить эту проблему, или вы можете использовать шаблоны и делать все во время компиляции. Также имейте в виду, что указатель является легковесным элементом, а не другим классом.
Показать ещё 5 комментариев
0

Каждый класс может содержать указатель :?

class Derived1
    Derived2 *p_d2;
class Derived2
    Derived1 *p_d1;

Ещё вопросы

Сообщество Overcoder
Наверх
Меню