首页 > 解决方案 > 在 C++08 中初始化对象以作为参数传递的首选语法是什么?

问题描述

假设我有一个结构,我只是将其用作聚合数据保存设备。例如,下面的结构包含两个整数值。假设我有一个名为 myVec 的这些结构的向量,并且我想使用 push_back 向该向量添加一个新结构。我的理解是,在 C++11 及之后,无需创建命名变量并将该变量作为参数传递即可实现此目的,而是可以执行以下操作。

struct coordinate {
    int y;
    int x;
};
//assume an initialized vector<coordinate> myVec 
//and two ints newY, newX not known at compile time
myVec.push_back( {newY,newX});

基于https://en.cppreference.com/w/cpp/language/aggregate_initialization的注释部分,这似乎是在构造函数初始化器列表中使用聚合初始化的示例,但我可能错了。该来源表明此语法在 C++11 之前不起作用,虽然它适用于 MSVS2017,但不适用于我所针对的适用于 Python 的 Visiual C++。是否有 C++11 之前的语法允许我向向量添加另一个结构,而无需先创建命名结构变量并将该命名变量传递给 push_back 函数?虽然这是我想要完成的一个示例,但我的项目中将有几个这样的向量,并且结构并不总是简单的整数对。我宁愿避免让几个“临时”虚拟变量作为参数的占位符四处浮动,因为避免让它们四处浮动感觉更干净。下面给出了一个我希望避免但会在必要时使用的示例。该示例将 x 和 y 值均介于 0 和 9 之间的所有坐标的列表添加到向量中。

coordinate temp = {0,0};
for (int r = 0; r < 10; ++r){
    for (int c = 0; c < 10; ++c){
        temp.y = r;
        temp.x = c;
        myVec.push_back(temp);
    }
}

标签: c++

解决方案


只需给你的结构一个构造函数:

  struct coordinate {
        int x, y;
        coordinate( int ax, int ay ) : x(ax), y(ay) {}
  };

然后你可以这样说:

 myVec.push_back( coordinate( 12, 42 ) );

推荐阅读