Как создать класс, который использует функции-члены, определенные в другом классе C++

Я новичок в объектно-ориентированном программировании и немного борюсь с тем, как лучше писать классы.

Я пытаюсь абстрагироваться от идеи сортировки по объектам, которые не являются просто списками чисел. У меня есть абстрактный базовый класс, SortableContainer, который содержит все необходимые виртуальные функции для сравнения и замены элементов, а также некоторые перегруженные операторы. Затем у меня есть два класса, полученных из этого, MVector а также CoordinateArray, Оба эти производных класса имеют правильные определения для всех виртуальных функций в базовом классе. Все до этого момента работало просто отлично. MVector просто хранит векторные объекты и CoordinateArray хранит векторы координат, для которых было определено понятие "меньше чем".

Моя проблема сейчас в том, что я создал новый класс, Life, который я хочу использовать для реализации игры жизни, используя CoordinateArray объект для хранения живых клеток. Контур моего Life класс выглядит так:

class Life
{
public:
   CoordinateArray LiveCells;

   Life();
};

Когда я создаю объект Life и инициализирую его координатами некоторых живых ячеек, ни одна из функций-членов, определенных в CoordinateArray производный класс будет работать. Как я могу это исправить? Нужно ли выводить Life класс из SortableContainer класс, а затем переопределить все чисто виртуальные функции? Любая помощь или направление, чтобы помочь, будет высоко ценится.

3 ответа

Было бы полезно увидеть объявление CoordinateArray. Тем не менее, я подозреваю, что вам нужно сделать открытые методы в CoordinateArray. Если методы объявлены закрытыми (то есть, они идут после private: в объявлении вашего класса), то они могут использоваться только внутри собственной области видимости класса. Если они объявлены публичными (под public:), то их можно использовать в любом объеме. (В качестве обозначения существует еще одна классификация защищенная, что означает, что они могут использоваться классом и любым его подклассами.)

Чтобы ответить на ваш вопрос просто и прагматично, да, если вы хотите, чтобы ваш Life Если у объекта есть некоторые функции-члены, они должны откуда-то прийти, самый простой способ - извлечь его из класса, содержащего эти функции-члены, композиция не передает членов владельцу, наследование делает это:

class Life : public CoordinateArray
{
public:
   Life();
};

Теперь вы можете использовать свой Life objects как CoordinateArray объект. Если что-либо является чисто виртуальным в родительском классе, вам действительно потребуется реализовать его в производном классе, но даже если что-то не так, вы все равно можете переопределить его в дочернем классе, чтобы перезаписать родительское поведение.

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

Чтобы инициализировать координаты некоторых живых ячеек, объявите класс CoordinateArray LiveCells общедоступным для Life

class Life::public CoordinateArray{ }
Другие вопросы по тегам