كيفية جعل متغير السلسلة الذي يدخله المستخدم هو اسم كائن جديد في الفصل الدراسي


أحاول الحصول على متغير سلسلة أدخله المستخدم اسم كائن جديد.
أريد أن يتم أخذ اسم كائن في فئة الطائرة من المستخدم. أي شيء أحاوله يجعل الكمبيوتر يعتقد أنني أريد إعادة تعريف اسم المتغير الذي أعطيته لتخزين مدخلات المستخدم وجعله الاسم الفعلي للكائن، بدلاً من أن يكون الكائن اسمًا لما يتم تخزينه في اسم المتغير. أعتقد أن المؤشر قد يكون هو الحل ولكني بدأت للتو في التعامل مع هذه الأمور ولا أعرف كيفية استخدامها بشكل صحيح

ما حاولت:

سي ++
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";
}

コメント

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