【问题标题】:Why I can't use parametric constructor within a class?为什么我不能在类中使用参数构造函数?
【发布时间】:2020-03-06 10:09:59
【问题描述】:

我在我的代码中使用Eigen 3.3.7 库。我可以在我的main() 中创建和填充数据向量,如下所示:

Vector3d H1(0.0, 0.0, 1.0);
Vector3d H2 = {0.0, 0.0, 1.0};
Matrix3d D(3,2); // Matrix is only initialised

但是,如果我在一个类中做同样的事情,我会得到语法错误:

class data {
    Vector3d H1(0.0, 0.0, 1.0);   //syntax error
    Vector3d H = {0.0, 0.0, 1.0}; //still works
    MatrixXd D(3,2);              //syntax error
};

问题 1:

为什么我不能在类的主体中使用相同的语法?

如何使用 Eigen 将 3×2 矩阵定义为 data 的属性?

问题 2:

我知道H1(0.0, 0.0, 1.0) 版本调用参数构造函数,但是,我不知道Vector3d H2 = {0.0, 0.0, 1.0}; 行下会发生什么。那么实际上是做什么的呢?为什么它在第二种情况下有效?

【问题讨论】:

  • 注:如果你在编译时知道你的矩阵是 3x2,你可以使用Eigen::Matrix<double, 3, 2> D; -- 而Matrix3d D(3,2); 应该在运行时断言。

标签: c++ oop c++11 constructor initialization


【解决方案1】:

对于 Q1,default member initializer(C++11 起)仅支持大括号初始化器和等号初始化器,但不支持括号初始化器。所以你可以

class data {
    Vector3d H1{0.0, 0.0, 1.0};
    Vector3d H2 = Vector3d(0.0, 0.0, 1.0); // or as you showed, Vector3d H2 = {0.0, 0.0, 1.0}
    MatrixXd D1{3, 2};
    MatrixXd D2 = MatrixXd(3, 2); // or MatrixXd D2 = {3,2};
};

对于 Q2,Vector3d H2 = {0.0, 0.0, 1.0}; 执行 copy-list-initialization(C++11 起),其效果取决于 Vector3d 的实现方式。 (在这种情况下,它似乎与Vector3d H1(0.0, 0.0, 1.0) 相同,即调用适当的构造函数来初始化对象。)

【讨论】:

    猜你喜欢
    • 2012-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-16
    相关资源
    最近更新 更多