如何从变量值初始化对象?

时间:2013-04-08 21:13:52

标签: c++ visual-c++

我想通过获取用户输入来生成即将初始化的对象的名称。这可能吗?有没有办法根据变量值命名对象?

我知道在下面的代码中“test x”不起作用,我知道为什么......但有没有办法让它工作?我一直试图弄清楚它2天了。我最接近的可能是串流......或者甚至更糟......这是不可能的?有什么帮助吗?

#include <iostream>
using namespace std;
#include <string>

class test
{
public:
    string wtf;
};

int main()
{
    test y;         // showing normal initialize
    y.wtf = "a";    // assign value


    string x;       
    cin >> x;       // initialize string and get input

    test x          // trying to initialize object based on input
    x.wtf = "a";    // then assign a value


    cout << y.wtf;  // printing both to test
    cout << x.wtf;

    return 0;
}

我的意图是拥有一个包含员工编号的单个数组(与“emp”或开头的某些内容连接在一起),以便为每个员工启动对象。所以用户会输入一个员工编号,比如1234,我会创建一个添加了emp + 1234的字符串,然后输出“emp1234”...然后我会启动一个像“test emp1234”这样的对象,这将有一堆在课堂内与其相关的差异变量。

我可能会看到这一切都错了......并且可能解释得相当蹩脚。我显然是新手,但我可以尽可能使用任何帮助。

2 个答案:

答案 0 :(得分:0)

我会这样做:

#include <vector>
#include <string>
#include <iostream>
#include <stdexcept>

test make_test()
{
    std::string s;
    if (!(std::cin >> s))
    {
        throw std::runtime_error("Premature end of input");
    }
    return { "emp" + s };
}

int main()
{
    std::vector<test> v;

    for (int i = 0; i != 10; ++i)
    {
         v.push_back(make_test());
         std::cout << "Added employee '" << v.back().wtf << "'\n";
    }
}

这将填充包含10个员工记录的向量。

答案 1 :(得分:0)

不,您无法在运行时创建变量名,因为名称在运行时不存在。它们是静态结构,仅在编译期间有用。

然而,听起来你只想要一个std::map。您可以使用它从整数(员工编号)映射到test对象:

std::map<int, test> employees;

int employeeNumber;
std::cin >> employeeNumber;

employees[employeeNumber]; // Will default construct a test object mapped to employeeNumber

// Alternatively:
test t( /* some constructor args */ );
employees[employeeNumber] = t;

然后,如果您想访问员工编号为test的{​​{1}}对象,您可以执行以下操作:

1234