c++命名类带有变量的对象
c++ naming class Objects with variables
为了好玩,我正在处理一个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
如果我理解正确,您希望创建变量,而不是变量的内容。这是不可能的,编译器生成一个符号,该符号最终引用内存中变量的地址(人类可读的名称)。在运行时,这些人类可读的符号已经失去了用途。不管怎样,为什么要使用动态变量名?
- 你能重载对象变量名本身返回的内容吗
- 将包含C样式数组的对象初始化为成员变量(C++)
- 将地址分配给本地指针后,公共对象的变量将消失
- 为什么我们再次从结构对象创建结构变量?
- 如何在初始化列表中的构造函数之后初始化变量/对象?
- 从变量对象指向基对象
- C++ - 我可以创建编译时变量对象吗?
- 动态数组添加元素而不创建结构变量/对象
- Visual Studio C++ 编译器在局部变量对象上的奇怪行为
- 其中定义函数的静态局部变量对象
- QT良好的全局变量/对象处理
- r 值的匿名变量对象与真实对象
- QT 测试 - 变量/对象失去价值
- 访问私有变量对象
- C++访问具有相同名称的变量/对象的命名空间中的全局变量/对象
- C++-访问全局变量对象
- 表达式必须具有类类型:c++,将实例变量对象作为指针传递(点表示法参数)
- C++变量/对象和堆内存管理
- 如何在每次迭代中创建一个新变量/对象的循环
- 初始化现有变量/对象的新构造函数