Cách lấy biến chuỗi do người dùng nhập làm tên của một đối tượng mới trong một lớp


Tôi đang cố gắng lấy biến chuỗi do người dùng nhập vào tên của một đối tượng mới.
tôi muốn tên của một đối tượng trong lớp máy bay được lấy từ người dùng. Bất cứ điều gì tôi thử đều khiến máy tính nghĩ rằng tôi muốn xác định lại tên biến mà tôi đã đặt để lưu trữ thông tin đầu vào của người dùng và đặt nó thành tên thực của đối tượng, thay vì đối tượng là tên được lưu trong tên biến. Tôi nghĩ con trỏ có thể là câu trả lời nhưng tôi mới bắt đầu tìm hiểu những vấn đề đó và không biết cách sử dụng nó một cách chính xác

Những gì tôi đã thử:

C++
string flight;
cin>> flight;
Airplane flight;

và như đã đề cập trước đó, tôi đã thử tạo chuyến bay thành một con trỏ trước dòng cuối cùng nhưng điều đó không hiệu quả, tuy nhiên điều đó có thể là do tôi sử dụng sai con trỏ 🙁

Giải pháp 1

Tên của một đối tượng có thể được lưu trữ trong một biến thành viên trong lớp. Trong trường hợp của bạn, nó có thể trông như thế này:

C++
class MyClass {
public:
    string flight;
};

MyClass Airplane;
cin >> Airplane.flight;

Giải pháp 2

Tên biến không thực sự tồn tại khi mã của bạn đang chạy: chúng được trình biên dịch sử dụng để tạo các vị trí lưu trữ có thể nằm trong bộ nhớ nhưng có thể nằm hoàn toàn trong bộ xử lý có một bộ thanh ghi lớn không liên quan gì đến bộ nhớ . Tên thực tế bạn đặt cho chúng được cố định khi bạn biên dịch ứng dụng của mình và bị loại bỏ khi tệp EXE bạn chạy được tạo.

Bạn không thể “tạo một biến” trong khi mã của bạn đang chạy, bạn tạo một vị trí lưu trữ (ví dụ trên heap) và lưu trữ vị trí của biến đó trong một biến hoặc một bộ sưu tập (tham chiếu đến vị trí đó được lưu trữ trong một biến ).

Hãy nghĩ về các biến như sách: cuốn sách có tiêu đề (biến có tên) và bạn có thể có nhiều sách trên giá (nhiều biến trong một ứng dụng), nhưng để thêm thông tin vào đó, bạn không cần phải tạo một cuốn sách mới một cách kỳ diệu. cuốn sách, bạn mở một cuốn sách hiện có và viết lên một trang. Sách là các biến trong mã của bạn, các trang là vị trí lưu trữ trong sách – và cũng giống như bạn thêm thông tin bằng cách tìm một trang trống để viết lên, trong mã của bạn, bạn thêm vị trí lưu trữ mới vào danh sách (ví dụ) và lưu trữ thông tin đó. thông tin trong đó.

Lớp này chứa các thành viên có thể bao gồm tên, địa chỉ, tuổi, điểm đến, v.v. – vì vậy, bạn tạo một phiên bản của lớp và điền thông tin cá nhân của từng người dùng mà bạn muốn thêm vào ứng dụng của mình!

Giải pháp 3

BẰNG Griff đã nêu, bạn không thể làm điều đó.
Một giải pháp thay thế có thể là sử dụng một unordered_map để liên kết chuỗi do người dùng cung cấp với đối tượng mới được xây dựng. Thử

C++
#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をコピーしました