C++ 将向量作为具有设定值的参数传入

C++ 将向量作为具有设定值的参数传入,c++,object,vector,constructor,parameter-passing,C++,Object,Vector,Constructor,Parameter Passing,概述: 我在用C++制作一个视频游戏,我需要一个敌人可以掉的物品列表,每个物品的掉落几率,但是不同的敌人可能有不同数量的物品可以掉落。 我有一个ActorDefinition类,它的构造函数定义了关于敌人的所有统计信息 问题是: 如何将向量传递给具有任意定义值的对象构造函数 例如,这就是我希望在使用静态数组时能够做到的: //first array is item types to drop, second array is drop chances as percentages ActorDe

概述:

<>我在用C++制作一个视频游戏,我需要一个敌人可以掉的物品列表,每个物品的掉落几率,但是不同的敌人可能有不同数量的物品可以掉落。 我有一个ActorDefinition类,它的构造函数定义了关于敌人的所有统计信息

问题是:

如何将向量传递给具有任意定义值的对象构造函数

例如,这就是我希望在使用静态数组时能够做到的:

//first array is item types to drop, second array is drop chances as percentages
ActorDefinition("actorname", [10, 2], [50, 90]);
这很好,只占一行。但我不能这样做,因为我需要动态大小,所以我想使用向量

所以我需要基本上做到这一点,这是可行的,并且实现了我想要的,但是非常混乱:

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); 
有没有一种方法可以做到这一点,而不用像上面那样添加单独的代码行?我有太多的参与者定义和太多的项目,如果我对每一个都这样做的话,它会堆积成一大堆烦人的代码,创建一个向量并用我的值推回每个索引


编辑-修复了我的示例代码中的打字错误

如下定义您的函数:

void ActorDefinition(
    const std::string& actorname,
    const vector<int>& drops,
    const vector<int>& dropChances); 
ActorDefinition("actorname", {10,2}, {50, 90});
使用C++11的语法,您可以编写以下代码:

vector<int> drops{10,2};
vector<int> dropChances{50,90};
ActorDefinition("actorname", drops, dropChances);
不过,请小心使用此最终表单。例如,这项工作:

void func(vector<int> a);
func({1,2});

注意:当您将50和90添加到drops而不是DropOpportunities时,上述所有示例还修复了代码中重复推回时的打字错误:

您可以定义如下函数:

typedef vector<int> vi; // handy while declaring a lot of them

int ActorDefinition(string name, vi vec1, vi vec2)
{
    // body here
}
因此,您可以使用此函数构造向量:

std::vector<int> v = make_vector<int>() << 50 << 90;
因此,在你的情况下:

ActorDefinition("name", make_vector<int>() << 50 << 90, make_vector<int>() << 10 << 20);
在C++11中,您可以简单地使用:

std::vector<int> v { 34,23 };
ActorDefinition("name", {10, 20}, {30, 50});

最终,我认为您不会硬编码这些值,而是持久地存储它们,然后读入它们?在这种情况下,只需要读取一个文件或数据库或您所拥有的内容,并在每个条目上循环。这是一个很好的观点,我在程序中使用硬编码值主要用于测试目的。通过文件传递是最有可能的,但是现在我只想知道C++中是否有可能这样的事情。什么让你感觉到你可以编写静态数组?不确定这真的很重要,因为它不允许只用一行来构建这些元素。调用ActorDefinition只需要1个like,但多个like会为该调用设置参数。我遇到的问题不是我需要引用一个现有的向量,而是我想在构造函数中内联构造一个数组,比如使用vector10,100构造一个值为100的10的向量,除非我需要使用自己定义的值,而不是。。。但是不需要typedef的东西:-它只会使代码更复杂。需要-std=c++11我想。@nielsen:typedef在这里并不紧急,我同意你的看法。但是它不需要c++11。我认为有时候,如果你在这里或那里声明了很多与问题相关的容器,那么代码更容易阅读。这就是为什么要用它…!:-@minarmahmud-关于typedef,我同意它是有用的,但是使用vi作为向量是没有用的。也许typedef向量向量可以是,但这并不能节省很多输入。无论如何-你确定这不需要c++11吗?这和我的安装有关…@nielsen:对不起,我的错。。typedef需要c++11。我将在回答中提到这一点。谢谢..!@minarmahmud-不是类型定义。。。我想是初始化列表。但没关系,你的答案是第一个解决问题的答案:-玩得开心。这正是我想要的,谢谢!哦,哈哈,我甚至没看到打字错误:P
template <typename T>
class make_vector {
public:
  typedef make_vector<T> my_type;
  my_type& operator<< (const T& val) {
    data_.push_back(val);
    return *this;
  }
  operator std::vector<T>() const {
    return data_;
  }
private:
  std::vector<T> data_;
};
std::vector<int> v = make_vector<int>() << 50 << 90;
ActorDefinition("name", make_vector<int>() << 50 << 90, make_vector<int>() << 10 << 20);
std::vector<int> v { 34,23 };
ActorDefinition("name", {10, 20}, {30, 50});