Как создать класс, который использует функции-члены, определенные в другом классе 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{ }