C# Programming

C++ में बहुरूपी डेटा अभिगम प्राप्त करना

Spread the love

C++ में बहुरूपी डेटा एक्सेस प्राप्त करना

C++ मूल रूप से “वर्चुअल वेरिएबल्स” को उसी तरह से समर्थन नहीं करता है जिस तरह से यह वर्चुअल फंक्शन्स को समर्थन करता है। कोई भी भाषा संरचना नहीं है जो सीधे डेटा सदस्यों को रनटाइम बहुरूपता प्रदर्शित करने की अनुमति देती है। हालाँकि, कई तकनीकें प्रभावी ढंग से इस व्यवहार का अनुकरण करती हैं, जिससे ऑब्जेक्ट के गतिशील प्रकार के आधार पर डेटा एक्सेस को बदलना संभव हो जाता है। यह विशेष रूप से तब उपयोगी होता है जब इनहेरिटेंस पदानुक्रम से निपटते हैं जहाँ विभिन्न व्युत्पन्न वर्गों को एक ही डेटा की अलग-अलग व्याख्याओं की आवश्यकता होती है।

मुख्य समस्या तब उत्पन्न होती है जब एक आधार वर्ग एक डेटा सदस्य घोषित करता है जिसके लिए उसके व्युत्पन्न वर्गों में अलग-अलग अर्थ होने चाहिए। उदाहरण के लिए, एक Shape आधार वर्ग की कल्पना करें जिसमें size सदस्य है। एक Circle size का उपयोग अपनी त्रिज्या का प्रतिनिधित्व करने के लिए कर सकता है, जबकि एक Rectangle इसका उपयोग क्षेत्रफल संग्रहीत करने के लिए कर सकता है। आधार वर्ग के size सदस्य तक सीधा पहुँच समस्याग्रस्त है क्योंकि इसमें संदर्भ-जागरूकता का अभाव है।

वर्चुअल वेरिएबल्स के अनुकरण के तरीके

कई तरीके इस चुनौती को प्रभावी ढंग से संबोधित करते हैं:

1. वर्चुअल गेटर्स और सेटर्स

सबसे सरल और अनुशंसित दृष्टिकोण में डेटा तक पहुँचने और उसे संशोधित करने के लिए वर्चुअल फ़ंक्शन्स का उपयोग करना शामिल है। डेटा सदस्यों में सीधे हेरफेर करने के बजाय, हम गेटर (जैसे, getSize()) और सेटर (जैसे, setSize()) विधियों पर निर्भर करते हैं। यह रनटाइम बहुरूपता प्राप्त करने के लिए C++ के मौजूदा वर्चुअल फ़ंक्शन तंत्र का लाभ उठाता है।


class Shape {
public:
  virtual double getSize() const = 0;
  virtual void setSize(double size) = 0;
};

class Circle : public Shape {
private:
  double radius;
public:
  double getSize() const override { return radius; }
  void setSize(double size) override { radius = size; }
};

class Rectangle : public Shape {
private:
  double area;
public:
  double getSize() const override { return area; }
  void setSize(double size) override { area = size; }
};

यह विधि प्रकार-सुरक्षित, स्वच्छ है, और यह सुनिश्चित करती है कि ऑब्जेक्ट के वास्तविक प्रकार के आधार पर रनटाइम पर सही गेटर/सेटर को कॉल किया जाता है।

2. std::variant का उपयोग करना

संभावित डेटा प्रकारों के पूर्व निर्धारित सेट वाले परिदृश्यों के लिए, std::variant एक विकल्प प्रदान करता है। यह एक ही चर के भीतर विभिन्न प्रकार के डेटा को संग्रहीत करने की अनुमति देता है, ऑब्जेक्ट के प्रकार के आधार पर उपयुक्त प्रकार का चयन करता है। यह दृष्टिकोण अधिक प्रत्यक्ष डेटा संग्रहण प्रदान करता है लेकिन रनटाइम त्रुटियों से बचने के लिए सावधानीपूर्वक प्रबंधन की आवश्यकता होती है।


#include <variant>

class Shape {
public:
  std::variant<double, std::pair<double, double>> size; // Radius or width/height
};

class Circle : public Shape {
public:
  Circle(double r) { size = r; }
};

class Rectangle : public Shape {
public:
  Rectangle(double w, double h) { size = std::make_pair(w, h); }
};

डेटा तक पहुँचने के लिए std::get या std::visit का उपयोग करने की आवश्यकता होती है, जो उचित प्रकार के संचालन को सुनिश्चित करता है।

निष्कर्ष

जबकि C++ में अंतर्निहित “वर्चुअल वेरिएबल्स” का अभाव है, डेटा एक्सेस के लिए वर्चुअल फ़ंक्शन्स का उपयोग डेटा हैंडलिंग में बहुरूपता प्राप्त करने के लिए एक मज़बूत और प्रकार-सुरक्षित समाधान प्रदान करता है। std::variant संभावित डेटा प्रकारों की एक निश्चित संख्या वाले परिस्थितियों के लिए एक विकल्प प्रदान करता है, लेकिन इसमें परिश्रमपूर्वक त्रुटि हैंडलिंग की आवश्यकता होती है। सबसे अच्छा तरीका आपकी परियोजना की विशिष्ट आवश्यकताओं और शामिल डेटा की जटिलता पर निर्भर करता है। मुख्य सिद्धांत जब भी बहुरूपी व्यवहार की आवश्यकता होती है, वर्चुअल फ़ंक्शन्स के माध्यम से डेटा एक्सेस को एनकैप्सुलेट करना है।

विषय सूची

प्रातिक्रिया दे

आपका ईमेल पता प्रकाशित नहीं किया जाएगा. आवश्यक फ़ील्ड चिह्नित हैं *