Предположим, что я должен реализовать 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
implemtation ?.
Два решения я попытался следующие:
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
класса, тем самым заставляя его реализовать все чисто виртуальную функцию.
Второй, но не настолько элегантна (мое мнение), как я делал это в том, что:
У меня есть полное определение и реализацию стека в 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);
}
не слишком уверен, что оба способа объединения всех трех классов - Данные, контейнеров и стека - это то, что они должны быть.
Как я могу решить эту проблему? ИЛИ, по крайней мере, выровнять его с «лучшей практикой», если таковой имеется.
удалить DataArray; ... не делайте этого, вы выделили массив, поэтому удалите его: delete [] DataArray; –
@ DanielJour. Спасибо что подметил это. Опечатка. Благодарю. – hello