【发布时间】:2015-10-14 08:23:15
【问题描述】:
假设我要使用动态数组分配来实现 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 移动到新的 Stack 定义中,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类扩展这个类,从而强制它实现所有的纯虚函数。
第二种,但不是那么优雅(我认为)的方式是:
我在StackADT中有完整的Stack定义和实现,然后在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);
}
不太确定将所有三个类(数据、容器和堆栈)组合在一起的两种方法是否是它们所设想的。
如何解决这个设计问题?或者至少将其与“最佳实践”保持一致(如果有的话)。
【问题讨论】:
-
删除数据数组; ...不要这样做,你分配了一个数组,所以删除一个: delete [] DataArray;
-
@DanielJour 。感谢您指出了这一点。错字。谢谢。
标签: c++ oop inheritance design-patterns