मान लें कि मैं गतिशील सरणी आवंटन का उपयोग करके स्टैक को कार्यान्वित करना चाहता हूं। मेरे पास निम्नलिखित कक्षाएं और उनके कार्य हैं।अमूर्तता के स्तर का उपयोग कर डेटा संरचना कार्यान्वित करना
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;
}
अगर मैं ऊपर की तरह कुछ को लागू, यह काफी अच्छी तरह से काम करता है। लेकिन हाल ही में, मुझे उपर्युक्त दो को लागू करने के लिए कहा गया है, फिर कोर स्टैक कार्यक्षमताओं के लिए एक अलग कार्यान्वयन है।
तो अब, अगर मैं ले जाने के 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
। इस तरह: - डेटा, कंटेनर और ढेर
bool StackArray::push(const Data& DataObj)
{
StackADT doPush;
doPush.push(DataObj);
}
भी सुनिश्चित नहीं हैं कि सभी तीन वर्गों के संयोजन के दोनों तरीकों:
StackADT - push
bool StackADT::push(const Data& DataObj)
{
if(!isFull)
return false;
else
{
top++;
DataArray[top] = DataObj;
}
return true;
}
तो StackArray - push
अंदर, मैं कुछ इस तरह कर दूँगा - वे क्या हैं मानते हैं।
मैं इस डिजाइन समस्या को कैसे हल कर सकता हूं? या कम से कम इसे "सर्वोत्तम अभ्यास" के साथ संरेखित करें यदि ऐसा कोई है।
DataArray हटाना; ... ऐसा न करें, आपने एक सरणी आवंटित की है, इसलिए एक हटाएं: हटाएं [] DataArray; –
@DanielJour। यह बात बताने के लिए धन्यवाद। टाइपो। धन्यवाद। – hello