Comment faire en sorte qu’une variable de chaîne saisie par l’utilisateur soit le nom d’un nouvel objet dans une classe


J’essaie d’obtenir qu’une variable de chaîne saisie par l’utilisateur porte le nom d’un nouvel objet.
je veux que le nom d’un objet dans la classe avion soit pris par l’utilisateur. Tout ce que j’essaie fait penser à l’ordinateur que je veux redéfinir le nom de variable que j’ai donné pour stocker l’entrée utilisateur et en faire le nom réel de l’objet, plutôt que l’objet étant le nom de ce qui est stocké dans le nom de la variable. Je pense que le pointeur pourrait être la réponse, mais je viens juste de commencer à m’y lancer et je ne sais pas comment l’utiliser correctement.

Ce que j’ai essayé :

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

et comme mentionné précédemment, j’ai essayé de faire de Flight un pointeur avant la dernière ligne mais cela n’a pas fonctionné, c’est peut-être moi qui ai abusé des pointeurs 🙁

Solution 1

Le nom d’un objet peut être stocké dans une variable membre de la classe. Dans votre cas, cela pourrait ressembler à ceci :

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

MyClass Airplane;
cin >> Airplane.flight;

Solution 2

Les noms de variables n’existent pas vraiment pendant l’exécution de votre code : ils sont utilisés par le compilateur pour créer des emplacements de stockage qui peuvent être en mémoire, mais peuvent être entièrement dans le processeur qui possède un grand ensemble de registres qui n’ont rien à voir avec la mémoire. . Les noms réels que vous leur donnez sont corrigés lorsque vous compilez votre application et sont supprimés lors de la création du fichier EXE que vous exécutez.

Vous ne pouvez pas “créer une variable” pendant l’exécution de votre code, vous créez un emplacement de stockage (sur le tas par exemple) et stockez l’emplacement de celui-ci dans une variable ou une collection (une référence à laquelle est stockée dans une variable ).

Pensez aux variables comme aux livres : le livre a un titre (la variable a un nom) et vous pouvez avoir de nombreux livres sur une étagère (de nombreuses variables dans une application), mais pour y ajouter des informations, vous ne créez pas comme par magie une nouvelle livre, vous en ouvrez un existant et écrivez sur une page. Les livres sont des variables dans votre code, les pages sont les emplacements de stockage dans le livre – et tout comme vous ajoutez des informations en trouvant une page vierge sur laquelle écrire, dans votre code vous ajoutez un nouvel emplacement de stockage à une liste (par exemple) et stockez le des informations là-dedans.

La classe contient des membres qui peuvent inclure le nom, l’adresse, l’âge, la destination, etc. Vous créez donc une instance de la classe et remplissez ses informations individuelles pour chaque utilisateur que vous souhaitez ajouter à votre application !

Solution 3

Comme Griffe dit, vous ne pouvez pas faire cela.
Une alternative pourrait consister à utiliser un unordered_map pour lier la chaîne fournie par l’utilisateur à l’objet nouvellement construit. Essayer

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