使用另一个类C++构造一个类

Constructing a class using an another class C++

本文关键字:一个 另一个 C++      更新时间:2023-10-16

我刚接触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()'

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

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

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

注意以下内容:

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

此外,请注意,还有std::vector,您可能需要重命名自己的向量以避免命名冲突,最好通过const引用传递vector

以下是出现问题的原因:

对象的构造分为多个阶段。对于矩阵类,首先需要构造所有成员对象,并且仅,然后执行构造函数主体。这里需要认识到的重要一点是,在输入构造函数主体之前,所有成员对象(在您的案例中为m1m2m3)都必须已经构造好。

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

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

或者,为vector提供一个默认构造函数,这样编译器就可以在没有额外信息的情况下自动构造矩阵成员,正如Zac的回答所建议的那样。

需要类向量的默认构造函数,即没有参数的构造函数:

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;
         }
  };

出现此错误的原因是:

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

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

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

  1. 当没有定义时,编译器将提供"默认复制构造函数"(实际上只是针对您的情况的逐位复制)
  2. 这个"默认副本构造函数"可以通过成员初始化列表调用

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

matrix (vector a, vector b, vector c)
: m1(std::move(a)),m2(std::move(b)),m3(std::move(c)) {
}
相关文章: