Jd *_*cis 0 c++ constructor vector object parameter-passing
概述:
我正在用C++制作一个视频游戏,我需要有一个敌人可以丢弃的项目列表,以及每个项目的丢弃几率,但不同的敌人可能会有不同数量的项目可以丢弃.我有一个ActorDefinition类,其构造函数定义了敌人的所有统计数据和事物.
所以这就是问题所在:
如何将向量传递给具有任意定义值的对象构造函数?
例如,这就是我想要的,就像我使用静态数组一样:
//first array is item types to drop, second array is drop chances as percentages
ActorDefinition("actorname", [10, 2], [50, 90]);
Run Code Online (Sandbox Code Playgroud)
这很好,它只占用一行.但我不能这样做,因为我需要动态大小,因此我想使用矢量.
所以我需要基本上做到这一点,(它可以工作并完成我想要的东西,但是非常混乱):
vector<int> drops;
drops.push_back(10);
drops.push_back(2);
vector<int> dropChances;
dropChances.push_back(50);
dropChances.push_back(90);
ActorDefinition("actorname", drops, dropChances);
Run Code Online (Sandbox Code Playgroud)
有没有办法做到这一点,而无需像上面那样添加单独的代码行?(我有很多演员定义和很多项目,如果我为每一个做这个,它会堆积大量烦人的代码)创建一个向量并用我的值推回每个索引?
编辑 - 修复了我的示例代码中的拼写错误
使用C++ 11的直接列表初始化语法,您可以这样写:
vector<int> drops{10,2};
vector<int> dropChances{50,90};
ActorDefinition("actorname", drops, dropChances);
Run Code Online (Sandbox Code Playgroud)
或者更简洁,但不一定更具可读性:
ActorDefinition("actorname", vector<int>{10,2}, vector<int>{50, 90});
Run Code Online (Sandbox Code Playgroud)
最后,如果您的函数重载可以明确地解决,您甚至可以使用复制列表初始化并像这样调用它:
ActorDefinition("actorname", {10,2}, {50, 90});
Run Code Online (Sandbox Code Playgroud)
尽管如此,请谨慎使用此最终表格.例如,这有效:
void func(vector<int> a);
func({1,2});
Run Code Online (Sandbox Code Playgroud)
但添加另一个func重载会中断func({1,2})调用:
void func(vector<int> a);
void func(set<int> a);
func({1,2});//ERROR! Call to func is ambiguous!
Run Code Online (Sandbox Code Playgroud)
(注意:上述所有例子也收拾你在反复有错字push_back在你的代码,当您添加50和90以drops代替dropChances:))