将新对象的名称作为参数传递
Passing the name for a new object as parameter
我尝试编程通用状态计算机,该计算机应在构造函数中获取所有相关信息。例如。以下面的形式:
StateMachine stateMachine =
{
{"state1", 1.5f, 4, 'c'},
{"state2", 5.3f, 2, 'z'}
};
statemachine的创建器采用initializer_list。param是一个容纳所有信息的构造。
//constructor
StateMachine(std::initializer_list<param> il)
{
test = new param[il.size()];
for (size_t i = 0; i < il.size(); i++)
test[i] = *(il.begin() + i);
}
和结构看起来像这样:
struct param
{
float f;
int i;
char c;
PassTest *test = nullptr;
param()
{
std::cout << "WHY" << std::endl;
}
param(std::string pass, float f, int i, char c) : test(new PassTest(pass)), f(f), i(i), c(c)
{
std::cout << f << 't' << i << 't' << c << std::endl;
}
};
到目前为止,我可以将信息{"state1", 1.5f, 4, 'c'}
存储在一个param的一个对象中。但是我想用param对象的名称替换字符串" state1",以便我可以使用statemachine构造函数中定义的名称直接访问此对象。为了给您留下深刻的印象。
StateMachine stateMachine =
{
{State1, 1.5f, 4, 'c'}, //State1 and State2 is no longer a String
{State2, 5.3f, 2, 'z'}
};
您知道该怎么做吗?
ps。这是一个没有模板或其他动态元素的测试设置。这些将稍后添加。
这个问题对我来说还不清楚...
但是,如果我正确理解您的问题:
在StateMachine
强制器中,只需通过param
的常规数组或向量(std::vector<param>
,http://www.cplusplus.com/reference/reference/vector/Vector/Vector/(
std::vector<param> prlist;
prlist.push_back(param("State1", 1.5f, 4, 'c'));
prlist.push_back(param("State2", 5.3f, 2, 'z'));
StateMachine machine = StateMachine(prlist);
然后您还需要修改StateMachine
类构造函数:
//constructor
StateMachine(std::vector<param> il)
{
test = new param[il.size()];
for (size_t i = 0; i < il.size(); i++)
test[i] = il[i];
}
因此,您想将"未来"变量名称传递给函数并使函数为您定义变量吗?抱歉,在C 中这是不可能的。您最接近的是宏。例如:
#define ADD_NAMED_ENTRY(name,value)
int name = (value);
entries.push_back(name);
int main() {
std::vector<int> entries;
ADD_NAMED_ENTRY(first, 1);
ADD_NAMED_ENTRY(second, 42);
// now the vector contains {1,42} but variables first and second also exist and have values 1 and 42, respectively
}
但是,请注意,您无法通过value
的支撑初始化器(因为预处理器不了解其{..., ..., ...}
格式,并且会破坏逗号(。您需要将其展开到ADD_NAMED_ENTRY(State1, 1.5f, 4, 'c');
。
在您的情况下,我宁愿建议让StateMachine
保持一个由状态名称而不是整数索引的std::unordered_map
:这样,您可以使用原始代码并参考沿states["state1"]
行的状态(使用字符串定义(,而不是通过新符号污染名称范围,必须应对其可见性,寿命等。
相关文章:
- 如何在不使用指针的情况下将派生类的对象作为参数传递给基类中的函数?
- 如何将对象数组作为参数传递给模板
- 如何将成员函数作为参数传递并在派生对象上执行方法列表
- 如何将子类作为函数的参数传递给期望基类,然后将该对象传递到指向这些抽象类对象的指针向量中?
- 对象作为参数传递,就好像我们正在传递构造函数值一样
- 我可以动态创建新地图并作为函数参数传递吗?
- 初始化对象以在 C++08 中作为参数传递的首选语法是什么?
- 为模板参数类型中的新对象分配内存
- 在C++中传递一个对象作为参数
- 将对象作为参数传递,没有可行的重载"="
- 将新对象的名称作为参数传递
- 将新对象作为默认参数传递给构造函数
- c++在成员初始化中,在构造函数中传递新对象
- 使用可变参数模板创建传递新对象的更安全方式是否是个好主意
- 如何创建一个模板化函数,该函数采用可变数量的参数,将参数传递给对象的正确构造函数?
- 从函数中作为参数传递的对象访问矢量数据
- 重载运算符 >>,将一个参数而不是 3 个参数传递给对象
- c++调用构造函数传递新对象会导致数据丢失
- 模板来访问作为参数传递的对象的不同成员
- 创建带有参数的新对象