Почему я не могу использовать параметрический конструктор внутри класса? - PullRequest
2 голосов
/ 10 ноября 2019

Я использую библиотеку 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:

Почему я не могу использовать один и тот же синтаксис в теле класса?

Как определить матрицу 3 на 2 какатрибут data с Eigen?

Вопрос 2:

Я понимаю, что H1(0.0, 0.0, 1.0) версия вызывает параметрический конструктор, однако я не знаю, что происходитпод линией Vector3d H2 = {0.0, 0.0, 1.0};. Так что же на самом деле делает? И почему это работает во втором случае?

1 Ответ

2 голосов
/ 10 ноября 2019

Для Q1 инициализатор элемента по умолчанию (начиная с 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), т. Е. Для инициализации объекта вызывается соответствующий конструктор.)

...