传入矢量作为具有设定值的参数

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)

有没有办法做到这一点,而无需像上面那样添加单独的代码行?(我有很多演员定义和很多项目,如果我为每一个做这个,它会堆积大量烦人的代码)创建一个向量并用我的值推回每个索引?

编辑 - 修复了我的示例代码中的拼写错误

Pra*_*han 5

使用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在你的代码,当您添加5090drops代替dropChances:))