Я, вероятно, упускаю что-то очень простое, но я буду очень признателен, если кто-то может указать мне правильное направление.
У меня есть 2 класса: A и B. A имеет коллекцию структур данных и функций, которые их изменяют (для гипотетического примера, скажем, добавить, удалить, вставить и т. Д. В структуры данных). B имеет набор функций, которые определяют как структуры данных изменены в A.
Ради расширяемости B наследуется, чтобы отразить различные возможные варианты поведения в структурах данных A. Одна реализация B может выбрать добавление в начало структуры данных A, удаление с конца и так далее. Другая реализация может добавить в конец, удалить с начала и так далее.
Я передаю объект базового класса B во время создания A, так что общие addNode (), deleteNode () и другие функции A могут фактически искать конкретный тип объекта B, переданный ему во время создания, и обращаться к его реализация в B о том, какие действия следовать.
В этом гипотетическом примере, приведенном ниже, рассматриваемая структура данных представляет собой двусвязный список. В моей проблеме сама структура данных не проблема. Я обеспокоен тем, как вызвать правильный метод в производном классе B, чтобы изменить мою структуру данных в A.
Класс А:
class A
{
static A create(B bObj); // returns an A object after calling the constructor
void addNode(int);
void deleteNode();
...
private:
struct myNode
{
int value;
myNode *next;
myNode *prev;
}
myNode *head;
myNode *tail;
}
Класс Б:
class B
{
virtual void addNode(int);
virtual void deleteNode();
...
}
Класс ChildB1:
class ChildB1
{
void addNode(int)
{
// code for add to the front
}
void deleteNode()
{
// code for delete from the back
}
}
Класс ChildB2:
class ChildB2
{
void addNode(int)
{
// code for add to the back
}
void deleteNode()
{
// code for delete from the front
}
}
Проблема, с которой я сталкиваюсь, заключается в том, как предоставить дочернему классу B доступ к текущему объекту A, над которым я работаю? Допустим, при создании объекта A (aObj) с помощью метода create () я передал ссылку на объект ChildB2.
B *bObj = new ChildB2();
A aObj = A.create(*bObj);
Теперь, когда я вызываю aObj.add (), я хочу, чтобы он вызывал метод add () класса ChildB2, чтобы он мог работать со связанным списком в A и добавлять его в конец списка. Но как функция add () класса ChildB2 получает доступ к связанному списку aObj?
Прошу прощения, если вопрос многословен и наивен. Я рад дать дополнительные разъяснения, если требуется.
добавлять B
как друг A
,
class A
{
friend class B;
// the rest
};
Так как дружба не передается по наследству, B
должен явно предоставить своим наследникам доступ к A
интимные части тела.
class B
{
protected:
// since A::myNode is private, redeclare it here
// for heirs
typedef A::myNode myNode;
// access to A parts
void getAParts (A*, myNode*** head, myNode*** tail)
{
*head = &a->head;
*tail = &a->tail;
}
// the rest
};
Пара замечаний: вы должны пройти B
в create
по ссылке, а не по значению, в противном случае ваш ChildB2
объект будет нарезанный. Вам также нужно управлять B
Жизнь как-то.
Других решений пока нет …