c++命名类带有变量的对象

c++ naming class Objects with variables

本文关键字:变量 对象 c++      更新时间:2023-10-16

为了好玩,我正在处理一个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"的类对象。如何通过变量为类对象指定名称,而不是在代码中手动指定名称。

你不能。正确的方法是将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"]将包含与名称"Susan"等相关联的Bunny

首先,您混淆了术语"成员"的使用类的"members"是类中定义的方法和变量,在您的情况下,这些方法和变量是变量"fname"、"sex"、"age"、"color"answers"status"以及方法s()、a()、c()和st()。当您调用"Bunny name(s,a,c,st);"不是"成员",而是该类的"实例"。

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

当您创建一个"std::string name",然后创建一个"Bunny name(…)"时,您正在创建两个名为"name"的不同变量,当您重用它时,它已经在使用,这对新对象的构造函数没有任何影响。如果有什么不同的话,编译器应该向您抱怨您重用了现有的变量名,尽管新的变量名仅限于循环的范围。

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

如果我理解正确,您希望创建变量,而不是变量的内容。这是不可能的,编译器生成一个符号,该符号最终引用内存中变量的地址(人类可读的名称)。在运行时,这些人类可读的符号已经失去了用途。不管怎样,为什么要使用动态变量名?