C++如何实现输入创建类对象?能否使用cin >> 对象名的方式?
结论
C++ 本身不支持 cin >> ObjectName 这种直接通过输入动态创建指定名称对象的写法。
原因说明
C++ 是静态编译型语言,所有变量(包括类实例对象)的名称仅在编译期有效,编译完成后生成的二进制程序里不会保留变量名字符串信息,只有内存地址、偏移量这类运行期可识别的标识。你通过 cin 输入的对象名是普通字符串,和代码里预定义的变量名没有直接关联,无法直接映射为新的变量。
替代实现方案
如果你需要实现「输入自定义名称,再输入构造参数创建实例,后续可以通过输入的名称访问实例」的效果,可以用 std::map 或 std::unordered_map 存储用户输入的名称字符串和对应类实例的映射关系,模拟你想要的功能。
基于你给出的Car类修改后的可运行示例:
#include <iostream> #include <unordered_map> #include <string> using namespace std; class Car { public: string brand; string model; int year; // 补充默认构造函数,保证map可以正常构造空值再赋值 Car() = default; Car(string x, string y, int z) : brand(x), model(y), year(z) {} }; int main() { // 存储自定义名称和Car实例的映射 unordered_map<string, Car> car_map; string object_name, brand, model; int year; // 接收用户输入的对象名 cout << "请输入要创建的对象名称:"; cin >> object_name; // 接收构造参数 cout << "请输入汽车品牌、型号、生产年份,空格分隔:"; cin >> brand >> model >> year; // 构造实例存入映射表 car_map[object_name] = Car(brand, model, year); // 后续可以通过输入的名称访问实例 cout << "你创建的" << object_name << "信息:" << car_map[object_name].brand << " " << car_map[object_name].model << " " << car_map[object_name].year << endl; return 0; }
如果只是需要动态创建实例,不需要绑定自定义的名称,那也可以直接先读取构造参数,再用参数构造对象即可,不需要额外用map存储。
内容的提问来源于stack exchange,提问作者Ali Ashrafi
相关产品推荐
相关产品推荐

