我正在处理c ++问题集以获得乐趣。我正在创建一个循环,它将对象添加到具有随机特征的类中。这些随机特征之一是对象名称。我有一个程序随机生成类对象的名称,但我无法弄清楚如何将这些名称分配给类对象。
这是我的班级和它的构造函数:
#include "stdafx.h"
#include <iostream>
#include "windows.h"
#include <string>
#include <sstream>
#include <array>
#include <time.h>
#include <conio.h>
class Bunny
{
public:
char fname;
int sex, age, color, status;
Bunny(int, int, int, int);
int s() { return (sex); }
int a() { return (age); }
int c() { return(color);}
int st() { return (status);}
};
Bunny::Bunny(int s, int a, int c, int st)
{
sex = s;
age = a;
color = c;
status = st;
}
这是生成“兔子”信息的循环。
std::string name;
for (n = 0; n < 1; n++)
{
int num = std::rand() % 5;
int s = std::rand() % 2;
std::string f = "Susan"; //this is normally a function which randomly gives names
name = f;
int a = 0;
int c = std::rand() % 5;
int st;
if (rand() % 50 == 43) st = 1; else st = 0;
Bunny name(s, a, c, st);
}
如果它正常工作,它应该成为这样的成员:
Bunny Susan(1, 0, 2, 0);
这不起作用,因为它创建了一个名为“name”而不是“Susan”的类对象。如何通过变量为类对象分配名称,而不是在代码中手动分配名称。
答案 0 :(得分:1)
你不能。正确的方法是将Bunny对象存储在map
中,其中名称是键,例如:
std::map<std::string, Bunny> bunnies;
std::string name;
for (n = 0; n < 1; n++) {
...
// Assign a name to "name"
...
bunnies[name] = Bunny(s, a, c, st);
}
然后 bunnies["Susan"]
将包含与名称相关联的Bunny
&#34; Susan&#34;等。
答案 1 :(得分:0)
首先,你混淆了“成员”一词的使用。类的'成员'是类中定义的方法和变量,在您的情况下,变量'fname','sex','age','color'和'status'以及方法s() ,a(),c()和st()。当你打电话给'兔子名字(s,a,c,st)时你正在创造什么;'不是“成员”,而是该类的“实例”。
其次,没有办法做你想做的事情。变量名只存在于程序员中,并且在运行时没有意义(除非您正在调试)。变量名必须能够在编译时确定,而您的随机化尝试在运行时进行。
当您创建'std :: string name'并稍后创建'Bunny name(...)'时,您将创建两个名称为'name'的不同变量,这是因为当您使用它时它已经被使用了重用它对你的新对象的构造函数没有任何影响。如果有的话,您的编译器应该向您抱怨您正在重用现有的变量名称,尽管新的变量名称仅限于循环的范围。
但真正的问题是,为什么你想要/需要这样做呢?如果您的变量名称是随机的,那么您如何在程序的其他地方引用这些变量?如果这样做的原因是需要在不知道标识符或预先需要的总数的情况下创建多个类实例,那么我建议查看std :: vector
答案 2 :(得分:-1)
如果我理解正确,你想要创建变量而不是变量的内容。 这是不可能的,编译器生成一个符号,该符号最终引用内存中的变量(人类可读的名称)。 在运行时,这些人类可读的符号已经失去了使用。无论如何,为什么你想要动态变量名?