#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);
}
};
Основная проблема, с которой вы сталкиваетесь, заключается в том, что вы не знаете все типы узлов до их объявления, что исправляется путем придания им одного типа. Я могу себе представить, что у вас есть причины для того, чтобы они были разными типами, и если это так, то вам, возможно, придется объявить абстрактный базовый класс для узлов, что является совершенно новой темой. Или вы могли бы просто объявить коллекцию и класс узла один раз и создать идентичные подклассы. Я могу отредактировать, чтобы сделать это, если вам нужно.