首页 > 解决方案 > 在初始值设定项列表中采用多个参数的成员变量

问题描述

当初始化列表中的成员变量接受多个参数时,它是如何工作的?如果我的理解是正确的,这样的变量只需要一个参数......

我遇到此问题的实际代码如下所示,您可以发现该成员group_trajectory接受三个参数。

ChompOptimizer::ChompOptimizer(ChompTrajectory* trajectory, const planning_scene::PlanningSceneConstPtr& planning_scene,
                               const std::string& planning_group, const ChompParameters* parameters,
                               const moveit::core::RobotState& start_state)
  : full_trajectory_(trajectory)
  , robot_model_(planning_scene->getRobotModel())
  , planning_group_(planning_group)
  , parameters_(parameters)
  , group_trajectory_(*full_trajectory_, planning_group_, DIFF_RULE_LENGTH)
  , planning_scene_(planning_scene)
  , state_(start_state)
  , start_state_(start_state)
  , initialized_(false)
{

标签: c++initializer-list

解决方案


如果我的理解是正确的,这样的变量只需要一个参数......

这是不正确的。初始化数据成员遵循数据成员类型产生的规则。如果一个数据成员的构造函数接受一个参数,它必须像那样初始化。如果需要三个,您必须提供三个。您显示的示例代码可能会产生误导,因为所有其他构造函数只需要一个参数 - 但这是一个巧合(或良好做法,考虑到长参数列表存在缺陷)。例子:

struct A {
   A(int) {} // takes one argument
   A(int, double) {} // overload with two arguments
};

struct B {
   B(int, int, int) {} // takes three argument
};

struct Test {
   Test() : 
      a(42), b(42, 43, 44) {}

   A a;
   B b;
};

在这个例子中,a(42)也可以是a(42, 3.14),因为这样的构造函数也是可用的。只需传递类型所需的内容即可进行实例化。


推荐阅读