इसलिए मैंने अभी एक स्ट्रक्चर बनाया है जो एक आयत बनाता है। संरचना ही इस तरह दिखती है

    struct _rect
{
    //bottom left vertex
    int x = 0;
    int y = 0;

    // width and height 
    int width = 0;
    int height = 0;

    //top right vertex
    int y2 = y + height;
    int x2 = x + width; 
};

//init rect
_rect rect01;
rect01.x = rect01.y = 50;
rect01.width = rect01.height = 200;

मुख्य सीपीपी में जब मैं इसका एक उदाहरण बनाना चाहता हूं तो मैं बस नीचे बाएं एक्स और वाई, प्लस चौड़ाई और ऊंचाई दर्ज करना चाहता हूं और मैं चाहता हूं कि यह शीर्ष दाएं वर्टेक्स की गणना करे, क्या x2 और y2 को असाइन करने का कोई तरीका है मैन्युअल रूप से ऐसा किए बिना मूल्य?

0
Mo_AminKiaee 22 नवम्बर 2021, 18:32
2
आप अपनी संरचना के नाम से अपरिभाषित व्यवहार से शुरू करते हैं: अंडरस्कोर से शुरू होने वाले नाम वैश्विक नामस्थान पर आरक्षित हैं ...
 – 
Aconcagua
22 नवम्बर 2021, 18:34
1
क्या आप x2,y2 की आवश्यकता समझा सकते हैं? आयत को एक बिंदु और खींची जाने वाली ऊँचाई और चौड़ाई की आवश्यकता होती है
 – 
yassine
22 नवम्बर 2021, 18:37
1
Constructor यहां कीवर्ड है: struct Rect { Rect(int x, int y, int w, int h) : x(x), y(y), width(w), height(h), y2(y+h), x2(x + w) { } }; - हालांकि जागरूक रहें, कि यदि आप उनमें से किसी एक को बदलते हैं तो सदस्य अपने आप अपडेट नहीं होते हैं - मैं इस तरह से तभी जाऊंगा जब आप इन सभी छह मानों को const बनाएं - या यदि आप उन्हें private बनाते हैं और आपके लिए अपडेट करने वाले उपयुक्त गेटर्स और सेटर्स प्रदान करते हैं। अन्यथा मैं मांग पर आवश्यक गणना करने वाले कार्यों के रूप में x2 और y2 प्रदान करूंगा। कौन सा चुनना है? उपयोग के मामले पर निर्भर करता है, लेकिन ज्यादातर मामलों में कार्य करता है।
 – 
Aconcagua
22 नवम्बर 2021, 18:41
1
आप सही हैं, इस सुझाव को हटा दिया
 – 
pptaszni
22 नवम्बर 2021, 18:41
1
@Mo_AminKiaee, सवाल यह है कि आपको स्टोर x2 और y2 की आवश्यकता क्यों है? मक्खी पर उनकी गणना क्यों नहीं करते? एक आयत पूरी तरह से चार संख्याओं (या तो x और y और चौड़ाई और ऊँचाई, या x1,y1 और x2,y2) द्वारा निर्दिष्ट किया जाता है। छह संख्याओं को संग्रहीत करना अनावश्यक है, और यह प्रोग्राम में बग के जोखिम को बढ़ाता है यदि कोई बिना कोड को संशोधित करता है यह समझना कि कोड का कौन सा हिस्सा यह सुनिश्चित करने के लिए जिम्मेदार है कि छह नंबर सभी एक दूसरे के अनुरूप हैं।
 – 
Solomon Slow
22 नवम्बर 2021, 19:09

2 जवाब

सबसे बढ़िया उत्तर

आपको एक विशिष्ट वर्ग बनाना चाहिए:

class Rect
{
public:
  Rect(int x, int y, unsigned int width, unsigned int height)
  : x(x), y(y), width(width), height(height)
  {};

  int x() { return x; };
  int y() { return y; };
  int top() { return y + height; };
  int right() { return x + width; };

private:
  int x;
  int y;
  unsigned int width;
  unsigned int height;
}

इससे आपको कक्षा विधियों में आवश्यक गणना करने की संभावना मिलती है। आप चाहें तो सेटर्स और अधिक गेटर्स भी बना सकते हैं।

4
BNilsou 22 नवम्बर 2021, 18:47
5
कंस्ट्रक्टर बॉडी में असाइनमेंट पर इनिशियलाइज़ेशन को प्राथमिकता दें ( stackoverflow.com/questions/1711990/…)
 – 
463035818_is_not_a_number
22 नवम्बर 2021, 18:40
1
सही विचार है, लेकिन कंस्ट्रक्टर में एक इनिशियलाइज़र सूची का उपयोग करें। Rect(int x, int y, unsigned width, unsigned height) : x(x), y(y), width(width), height(height) { ... }. लेकिन, निश्चित रूप से, वास्तविक कोड तर्क और डेटा सदस्य के लिए समान नाम का उपयोग नहीं करेगा। +1।
 – 
Pete Becker
22 नवम्बर 2021, 18:41
चर और प्राप्तकर्ताओं को एक दूसरे से भिन्न पहचानकर्ताओं की आवश्यकता होती है।
 – 
Aconcagua
22 नवम्बर 2021, 18:57

नीचे कार्य करने का पूरा उदाहरण दिया गया है:

#include <iostream>
class Rect
{
public:
  //parameterized constructor 
  Rect(int px, int py, unsigned int pwidth, unsigned int pheight): x(px), y(py), width(pwidth), height(pheight), x2(x + width), y2(y + height)
  {
    
    
   
  };
  
  //getter so that we can get the value of x2 
  int getX2()
  {
      return x2;
  }
  //getter so that we can get the value of y2 
  int getY2()
  {
      return y2;
  }

private:
  int x = 0;
  int y = 0;
  unsigned int width = 0;
  unsigned int height = 0;
  
  int x2 = 0, y2 = 0;
};

int main()
{
    //create Rect instance
    Rect r(50, 50, 200, 200);
    //lets check if x2 and y2 were calculate correctly
    std::cout<<"x2 is: "<< r.getX2()<<std::endl;
    std::cout<<"y2 is: "<< r.getY2()<<std::endl;
}

उपरोक्त प्रोग्राम का आउटपुट यहां देखा जा सकता है।

0
Anoop Rana 22 नवम्बर 2021, 19:09
1
मुझे संदेह है कि प्रश्न केवल-पढ़ने के लिए कक्षा बनाने के बारे में नहीं था। साथ ही, x2 और y2 को इनिशियलाइज़र सूची में इनिशियलाइज़ किया जाना चाहिए।
 – 
Pete Becker
22 नवम्बर 2021, 18:50
ना। ओपी के प्रश्न में अंतिम वाक्य पढ़ें। वह लिखता है "मैं इसका एक उदाहरण बनाना चाहता हूं, मैं बस नीचे बाएं x और y, प्लस चौड़ाई और ऊंचाई दर्ज करना चाहता हूं और मैं चाहता हूं कि यह शीर्ष दाएं शीर्ष की गणना करे, क्या x2 और y2 को असाइन करने का कोई तरीका है मान मैन्युअल रूप से ऐसा किए बिना?" तो ओपी उदाहरण बनाना चाहता है और केवल आपूर्ति चर x,y, height, width चाहता है। इसके बाद वह स्वचालित रूप से चर x2, y2 की गणना करना चाहता है।
 – 
Anoop Rana
22 नवम्बर 2021, 18:53
यह प्रश्न का असाधारण रूप से संकीर्ण पठन है।
 – 
Pete Becker
22 नवम्बर 2021, 18:58
उद्धृत वाक्य के अनुसार ओपी ठीक यही चाहता है।
 – 
Anoop Rana
22 नवम्बर 2021, 19:01
आपको लगता है कि आपने पीट की टिप्पणी को गलत समझा है - सबसे पहले इनिशियलाइज़र्स को : x(px), /* the others */ x2(x+width), y2(...) जैसा दिखना चाहिए (आप x और width का उपयोग कर सकते हैं जैसा कि आपने उन्हें पहले ही इनिशियलाइज़ किया था; वैकल्पिक रूप से px का उपयोग करें और pwidth के बजाय), तो 'केवल पढ़ने के लिए' केवल उस संदर्भ में है कि आपकी कक्षा अब मानों को संशोधित करने की अनुमति नहीं देती है - जो शब्द 'पूर्ण'< को संबोधित करता है /i>, एक दावा जो आप (संभवतः?) अभी तक नहीं मिले हैं क्योंकि उपयुक्त सेटर्स की कमी है ...
 – 
Aconcagua
22 नवम्बर 2021, 19:03