5

我是 C++ 新手,最近开始研究面向目标的编程。我想编写自己的线性代数模块来处理三维向量和 3x3 矩阵。我试图将矩阵定义为由三个向量组成的类。

class vector {
  public:
  double n1, n2, n3;
  vector (double a, double b, double c) {
         n1 = a; n2 = b; n3 = c;
         }
  };

class matrix {
  public:
         vector m1, m2, m3;
         matrix (vector a, vector b, vector c) {
                m1 = a; m2 = b; m3 = c;
                }
         };

但是,我收到编译错误:

In constructor `matrix::matrix(vector, vector, vector)':
no matching function for call to `vector::vector()'

我猜这个程序不知道如何使用我定义的向量类来构造一个矩阵。但是我不明白为什么。如果有人可以解释,我将不胜感激。

4

5 回答 5

6

您需要m1,m2,m3通过成员初始化器列表初始化您的成员:

matrix (const vector& a, const vector& b, const vector& c)
: m1(a),m2(b),m3(c)

请注意以下事项:

  • 这种形式只能与构造函数一起使用。
  • 您必须(至少在 C++11 之前的版本中)使用这种形式来初始化 非静态 const数据成员。
  • 您必须使用此表单来初始化引用数据成员。

另外,请注意,std::vector您可能希望重命名自己的向量以避免命名冲突,并且您最好vector通过 const 引用。

于 2013-08-29T11:43:25.227 回答
4

这就是出错的原因:

对象的构建发生在多个阶段。对于您的矩阵类,您首先需要构造所有成员对象,然后才执行构造函数主体。这里要意识到的重要一点是,在进入构造函数主体之前,所有成员对象(在您的情况下m1m2m3)必须已经构造。

问题是编译器不能自己构造vector成员:它只知道一个构造函数vector,一个需要三个doubles 来构造,而它没有。vector正如 billz 的回答所建议的那样,您可以为编译器提供那些缺少的构造函数参数以使用初始化列表语法。

这是因为初始化列表是在启动的成员构造阶段执行的,这发生在构造函数主体阶段之前。

或者,提供一个默认构造函数,vector以便编译器能够自动构造矩阵成员而无需额外信息,正如 Zac 的回答所建议的那样。

于 2013-08-29T12:02:19.487 回答
1

需要类vector的默认构造函数,即不带参数的构造函数:

class vector {
  public:
  double n1, n2, n3;
  vector () { // <- this one
    n1 = 0; n2 = -1; // sample initializing code
  };
  vector (double a, double b, double c) {
         n1 = a; n2 = b; n3 = c;
         }
  };
于 2013-08-29T11:53:35.073 回答
0

您收到此错误的原因是:

  1. 您的向量类没有默认构造函数,因为您定义了一个带参数的显式构造函数。
  2. 一个对象的数据成员将在对象构造期间但在构造函数中的代码执行之前被初始化。

所以当编译器要创建矩阵对象时,首先需要在矩阵构造函数的这些代码“{ m1 = a; m2 = b; m3 = c;}”之前构造/初始化m1/m2/m3。但是,m1/m2/m3 类没有要调用的默认构造函数。这就是编译器报告“In constructor matrix::matrix(vector, vector, vector)': no matching function for call tovector::vector()'”的原因

解决方法是通过成员初始化列表来初始化m1/m2/m3。这有效,因为:

  1. 当未定义时,编译器将提供“默认复制构造函数”(实际上只是按位复制)。
  2. 这个“默认复制构造函数”可以通过成员初始化列表来调用。
于 2013-08-29T12:04:23.207 回答
0

或者使用“推荐的 c++11”方式:

matrix (vector a, vector b, vector c)
: m1(std::move(a)),m2(std::move(b)),m3(std::move(c)) {
}
于 2013-08-29T13:08:26.967 回答