oop — C ++: как заставить другую функцию класса манипулировать моей переменной-членом класса

Я, вероятно, упускаю что-то очень простое, но я буду очень признателен, если кто-то может указать мне правильное направление.

У меня есть 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?

Прошу прощения, если вопрос многословен и наивен. Я рад дать дополнительные разъяснения, если требуется.

2

Решение

добавлять 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Жизнь как-то.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]