उपयोगकर्ता द्वारा इनपुट किए गए स्ट्रिंग वेरिएबल को किसी क्लास में किसी नए ऑब्जेक्ट का नाम कैसे प्राप्त करें

[ad_1]

मैं एक उपयोगकर्ता द्वारा इनपुट किए गए स्ट्रिंग वेरिएबल को एक नए ऑब्जेक्ट का नाम प्राप्त करने का प्रयास कर रहा हूं।
मैं चाहता हूं कि क्लास एयरप्लेन में किसी ऑब्जेक्ट का नाम उपयोगकर्ता से लिया जाए। मैं जो कुछ भी कोशिश करता हूं वह कंप्यूटर को सोचने पर मजबूर कर देता है कि मैं उपयोगकर्ता इनपुट को संग्रहीत करने के लिए दिए गए वेरिएबल नाम को फिर से परिभाषित करना चाहता हूं और इसे ऑब्जेक्ट का वास्तविक नाम बनाना चाहता हूं, न कि ऑब्जेक्ट का वह नाम जो वेरिएबल नाम में संग्रहीत है। मैं सोच रहा हूं कि सूचक इसका उत्तर हो सकता है, लेकिन मैंने अभी-अभी उनमें शामिल होना शुरू किया है और नहीं जानता कि इसका सही तरीके से उपयोग कैसे किया जाए

मैंने क्या प्रयास किया है:

सी++
string flight;
cin>> flight;
Airplane flight;

और जैसा कि पहले उल्लेख किया गया है कि मैंने अंतिम पंक्ति से पहले फ्लाइट को एक पॉइंटर बनाने की कोशिश की थी लेकिन वह काम नहीं कर सका, हो सकता है कि मैं पॉइंटर्स का दुरुपयोग कर रहा हूँ:(

समाधान 1

किसी ऑब्जेक्ट का नाम क्लास में सदस्य वेरिएबल में संग्रहीत किया जा सकता है। आपके मामले में, यह इस तरह दिख सकता है:

सी++
class MyClass {
public:
    string flight;
};

MyClass Airplane;
cin >> Airplane.flight;

समाधान 2

जब आपका कोड चल रहा हो तो वेरिएबल नाम वास्तव में मौजूद नहीं होते हैं: उनका उपयोग कंपाइलर द्वारा स्टोरेज स्थान बनाने के लिए किया जाता है जो मेमोरी में हो सकते हैं, लेकिन पूरी तरह से प्रोसेसर के भीतर हो सकते हैं जिसमें रजिस्टरों का एक बड़ा सेट होता है जिनका मेमोरी से कोई लेना-देना नहीं होता है . आपके द्वारा दिए गए वास्तविक नाम आपके ऐप को संकलित करते समय तय हो जाते हैं, और जब आपके द्वारा चलाई गई EXE फ़ाइल बन जाती है तो हटा दिए जाते हैं।

जब आपका कोड चल रहा हो तो आप “वेरिएबल नहीं बना सकते”, आप एक भंडारण स्थान बनाते हैं (उदाहरण के लिए ढेर पर) और उसके स्थान को एक चर या संग्रह में संग्रहीत करते हैं (एक संदर्भ जो एक चर में संग्रहीत होता है) ).

किताबों जैसे वेरिएबल के बारे में सोचें: किताब का एक शीर्षक होता है (वेरिएबल का एक नाम होता है), और आपके पास एक शेल्फ पर कई किताबें हो सकती हैं (एक ऐप में कई वेरिएबल), लेकिन इसमें जानकारी जोड़ने के लिए आप जादुई रूप से एक नया नहीं बना सकते पुस्तक, आप एक मौजूदा पुस्तक खोलते हैं और एक पृष्ठ पर लिखते हैं। पुस्तकें आपके कोड में परिवर्तनशील हैं, पृष्ठ पुस्तक के भीतर भंडारण स्थान हैं – और जैसे आप लिखने के लिए एक खाली पृष्ठ ढूंढकर जानकारी जोड़ते हैं, अपने कोड में आप एक सूची में एक नया भंडारण स्थान जोड़ते हैं (उदाहरण के लिए) और संग्रहीत करते हैं उसमें जानकारी.

कक्षा में ऐसे सदस्य होते हैं जिनमें नाम, पता, आयु, गंतव्य इत्यादि शामिल हो सकते हैं – इसलिए आप कक्षा का एक उदाहरण बनाते हैं और प्रत्येक उपयोगकर्ता के लिए इसकी व्यक्तिगत जानकारी भरते हैं जिसे आप अपने ऐप में जोड़ना चाहते हैं!

समाधान 3

जैसा ग्रिफ़ कहा, आप ऐसा नहीं कर सकते।
एक विकल्प का उपयोग किया जा सकता है unordered_map उपयोगकर्ता द्वारा प्रदत्त स्ट्रिंग को नवनिर्मित ऑब्जेक्ट से लिंक करने के लिए। कोशिश

सी++
#include <iostream>
#include <unordered_map>
using namespace std;


class Airplane
{
  unsigned tons;
public:
  Airplane(unsigned tons):tons(tons){}
  Airplane():Airplane{100}{}
  unsigned get_tons() const {return tons;}
};


int main()
{
  string ap_name;
  unsigned ap_tons;
  unordered_map<string, Airplane> m_ap;

  m_ap.emplace( "plane1", 100 );
  m_ap.emplace( "plane2", 120 );
  m_ap.emplace( "plane3", 130 );

  // example of look-up by name
  cout << "weight of plane2 is " << m_ap["plane2"].get_tons() << "\n";


  // user will name next airplane
  cout << "name your airplane: ";
  cin >> ap_name;
  cout << "specify its weight (tons): ";
  cin >> ap_tons;

  m_ap.emplace( ap_name, ap_tons );


  for (auto const & [name, plane] : m_ap )
    cout << "m_ap[" << name << "] weights " << plane.get_tons() << "\n";
}

[ad_2]

コメント

タイトルとURLをコピーしました