Предположим, что я должен реализовать Stack, используя динамическое распределение массива. У меня есть следующие классы и их функции.
Data.h
class Data
{
public:
Data(std::string fname, int age) : name(fname) , age(age) {}
private:
std::string name;
int age;
}
StackArray.h
#include "Data.h"
class StackArray
{
public:
StackArray(int sSize) : size(sSize), top(-1)
{
DataArray = new Data[size];
};
~StackArray() { delete[] DataArray; };
StackArray& operator=(StackArray& StackArrayObj) { //use copy&swap here };
Stack(const StackArray& StackArrayObj);
bool isFull();
bool isEmpty();
void push(Data& DataObj);
void pop();
private:
Data* DataArray;
int top;
int size;
}
Если я реализую что-то вроде выше, он работает очень хорошо. Но в последнее время меня попросили реализовать эти два, как есть, а затем иметь отдельную реализацию для основных функций Stack.
Итак, если я переместил push
, pop
, isFull
, isEmpty
в новое определение стека, какова будет цель реализации class StackArray
?
Два решения, которые я пробовал, следующие:
New class implemtation
class StackADT
{
public:
StackADT();
virtual ~StackADT() = 0;
virtual bool isFull() = 0;
virtual bool isEmpty() = 0;
virtual void push(Data& DataObj) = 0;
virtual void pop() = 0;
}
Затем, расширив этот класс из класса StackArray
, тем самым вынудив его реализовать всю чистую виртуальную функцию.
Второе, но не очень элегантное (мое мнение), как я это сделал, заключается в следующем:
У меня есть полное определение и реализация Stack in StackADT
, а затем вызов соответствующих методов в эквивалентных методах в StackArray
. Вот так:
StackADT - push
bool StackADT::push(const Data& DataObj)
{
if(!isFull)
return false;
else
{
top++;
DataArray[top] = DataObj;
}
return true;
}
затем внутри StackArray - push
, я сделаю что-то вроде этого:
bool StackArray::push(const Data& DataObj)
{
StackADT doPush;
doPush.push(DataObj);
}
Не слишком уверен, что оба метода объединения всех трех классов - Data, Container и Stack - это то, что они должны быть.
Как я могу решить эту проблему? ИЛИ, по крайней мере, выровнять его с "лучшей практикой", если таковой имеется.