C связь двух узлов между двумя классами

#c #class

#c #класс

Вопрос:

Я застрял с этой проблемой. Учитывая код фрейма

 class P
{
public:
    class C1
    {
    public:
        class D
        {
        public:
            int data;
            D* next;
            typename C2::D* link;
            
            D(int data)
            {
                this->data = data;
                this->next = NULL;
                this->link = NULL;
            }
        };
        D* first;
        void add(int data);
    };

    class C2
    {
    public:
        class D
        {
        public:
            int data;
            D* next;
            typename C1::D* link;

            D(int data)
            {
                this->data = data;
                this->next = NULL;
                this->link = NULL;
            }
        };
        
        void add(int data);
    };

public:
    C1* c1 = new C1();
    C2* c2 = new C2();
    void add(int data);
};
 

Когда я вызываю функцию добавления класса P, выполняются две функции добавления класса C1 и класса C2 для создания двух новых узлов с заданными данными для каждого класса C1 и C2. Проблема в том, что я хочу, чтобы узел в C1 содержал адрес соответствующего узла в C2, и аналогично (по ссылке указателя). Кто-нибудь может дать мне идею, пожалуйста?

Комментарии:

1. Зачем объявлять два совершенно разных класса, которые идентичны? Цель класса — определить, как он работает, а затем вы можете создавать из него отдельные объекты.

2. может быть, вам нужно прямое объявление (класс c2;). но какую задачу вы пытаетесь решить

Ответ №1:

У меня есть некоторые опасения по поводу дизайна. Я бы просто использовал стандартные контейнеры и позволил им дублировать данные по мере необходимости и избегать использования каких-либо необработанных указателей. Но это зависит от вас.

Чтобы ответить на вопрос, вам нужно объявить свой класс узла один раз, и тогда он знает, как объявить указатель на себя. Класс — это тип, что означает, что все экземпляры работают точно так же. Аналогично, C1 и C2 идентичны, поэтому я не вижу никаких причин объявлять их как разные типы, поэтому я взял на себя смелость объединить их, хотя на самом деле вам нужно сделать это только с вашим типом узла (который должен знать, каков тип узла).

Скрывая все это в P, мы можем создавать узлы и их перекрестные указатели в P::add, обрабатывая это как конструктор фабрики.

 class P
{
public:
    class D
    {
    public:
        int data;
        D* next;
        D* link;

        D(int data)
        {
            this->data = data;
            this->next = NULL;
            this->link = NULL;
        }
    };

    class C
    {
    public:
        D* first;
        void add(D* node);
    };

    // encapsulate in P
    C* c1 = new C();
    C* c2 = new C();

public:
    void add(int data) {
        // encapsulated in P so we can create the raw pointers
        D* D1 = new D(data);
        D* D2 = new D(data);
        D1->link = D2;
        D2->link = D1;
        c1->add(D1);
        c2->add(D2);
    }
};
 

Основная проблема, с которой вы сталкиваетесь, заключается в том, что вы не знаете все типы узлов до их объявления, что исправляется путем придания им одного типа. Я могу себе представить, что у вас есть причины для того, чтобы они были разными типами, и если это так, то вам, возможно, придется объявить абстрактный базовый класс для узлов, что является совершенно новой темой. Или вы могли бы просто объявить коллекцию и класс узла один раз и создать идентичные подклассы. Я могу отредактировать, чтобы сделать это, если вам нужно.