有没有一种简单的方法在运行时在c ++中创建/命名对象?

时间:2016-12-02 07:08:06

标签: c++

我对编程很新!

所以我正在构建一个程序,它只是获取用户的信息并将其存储在一个对象中。因此,每次有新用户出现时,我都需要一个带有新名称的新对象(这只是我正在构建的一个程序)。我知道我在堆上也分配了空间,但是如果我不知道我想要多少个对象,我怎么知道需要多少空间呢?我想我需要做的是在创建obj的函数中在堆上分配内存所以每次调用函数时我都得到所需的内存?我读过有人建议使用矢量的东西,所以我简要介绍了一些关于那些的介绍,但是当我尝试这个时

string objname;
cin >> objname;
vector<string> v;
v.push_back(objname);
usersclass v.back();
v.back().somefunc();

发生错误,我真的认为它不会有任何不同:

string objname;
cin >> objname;
usersclass objname;
objname.somefunc();

请举个例子,这不是为了学校或我自学的任何东西。

3 个答案:

答案 0 :(得分:4)

您无法在运行时命名对象。实际上,在运行时,所有这些漂亮的变量名都消失了,在构建程序时由编译器和链接器替换为地址和偏移量。

您可以执行std::map<std::string, usersclass> names;并将其与names[objname].somefunc()

一起使用

std::map为您管理所有存储空间,因此您无需分配或取消分配任何内容。

Documentation on std::map

答案 1 :(得分:0)

你正在尝试做一些奇怪的事情,因为vector v只包含字符串,而你只是编写错误的代码。

我假设你想要创建usersclass对象,所以你需要一个以std::string为参数的构造函数,你的代码应该是这样的。

class usersclass {
public:
    usersclass(const std::string& arg) : m_string(arg) {};
    void somefunc() { /* 'dunno, maybe std::cout << m_string' ? */ }
private:
    std::string m_string;
}

// somewhere in main()
string objname;
cin >> objname;
usersclass userobject{ objname };
userobject.somefunc();

但总的来说,我建议您阅读here中的任何初学者书籍。这对你很有帮助。

答案 2 :(得分:0)

我还没看过std :: map所以我可以对此发表评论,但是Starl1ght是对的,不正确的代码我真的没有理解obj / classes这样做以防其他初学者需要超级简单的示例程序:

int main()
{
std::vector<newclass> vnewclass;
int x(1);
int z(0);
int c;
while(x == 1)
{
    std::cout << z << std::endl;
    newclass objs;
    objs.printhi();
    objs.enterdata();
    objs.printdata();
    vnewclass.push_back(objs);
    std::cout << "add obj ?" << std::endl;
    std::cin >> x;
    z++;
}
std::cout << "what obj would you like to view ?" << std::endl;
std::cin >> c;
vnewclass[c].printdata();
return 0;
}