2014-08-27 89 views
0

我正在通过为乐趣设置的C++问题。我正在创建一个将对象添加到具有随机特征的类的循环。其中一个随机特征是对象名称。我有一个程序为类对象随机生成名称,但我无法弄清楚如何将这些名称分配给类对象。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); 

这不工作,因为它创建了一个名为“名”,而不是“苏珊”一类的对象。我如何通过变量为类对象分配名称,而不是在代码中手动分配名称。

+2

你不能那样做。 – abelenky 2014-08-27 22:14:44

+0

C++类不能在运行时修改。 – Barmar 2014-08-27 22:15:08

+2

使用'std :: map'将字符串像“Susan”'写入数据。 – Barmar 2014-08-27 22:16:06

回答

1

你不能。要做到这一点,正确的方法是存储在一个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

+1

你的意思是'兔子[“苏珊”]' – Barmar 2014-08-27 22:18:57

+0

@Barmar:正确;固定。 – jwodder 2014-08-27 22:22:12

+1

我将如何访问新对象的类函数?从我的例子访问函数a()id使用'Susan.a()'。它会是“兔子”(“苏珊”)。a()'? – jeffpkamp 2014-08-27 22:30:41

-1

如果我正确理解你,你想创建变量而不是变量的内容。 这是不可能的,编译器会生成一个符号,最终引用一个变量(人类可读名称)的内存地址。 在运行时,这些人类可读符号已失去其用途。无论如何,你为什么要动态变量名?

+0

我正在生成随机类对象,最多为1000个,并且输入1000个类对象名称似乎很乏味,所以我正在使用循环生成它们。 – jeffpkamp 2014-08-27 22:27:41

0

首先,你混合使用术语“成员”。一个类的'成员'是类中定义的方法和变量,在你的情况下,变量是'fname','sex','age','color','status'和方法s() ,a(),c()和st()。当你打电话给'Bunny name(s,a,c,st)'时创建的';'不是'成员',它是该班级的“实例”。

其次,没有办法做你想做的事情。变量名只存在于程序员,并且在运行时没有意义(除非您正在调试)。变量名必须能够在编译时确定,而您的随机化尝试发生在运行时。

当你创建一个'std :: string name'并且以后创建一个'Bunny name(...)'时,你将创建两个不同的名字为'name'的变量,事实上它已经在使用你重用它对你的新对象的构造函数没有任何影响。如果有的话,你的编译器应该向你抱怨你正在重用一个现有的变量名,尽管新的变量名被限制在循环的范围之内。

然而,真正的问题是,为什么你想/需要这样做呢?如果你的变量名是随机的,那么你将如何在程序的其他地方引用这些变量?如果这样做的原因是需要创建多个类实例而不知道它们的标识符或事先需要的总数,那么我建议看看std :: vector

+0

该变量只是将名称从生成器移动到对象的一种方法。生成“名称”列表,以便我可以稍后调用这些值。如果您将jwodder包含在下面的例子中,您的答案会更有帮助。 – jeffpkamp 2014-08-27 23:39:27

+0

我曾经想过回去并在第一次发布回复后添加一个示例,但jwodder的差不多是我将要使用的示例,它使用字符串值映射到类实例的标识符 – rdowell 2014-08-28 19:01:04