繁体   English   中英

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

[英]Constructing a class using an another class C++

我是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中)使用此表单初始化非静态const数据成员。
  • 您必须使用此表单初始化参考数据成员。

另外,请注意,有std::vector ,您可能希望将自己的向量重命名为void命名冲突,并且最好通过const引用传递vector

这就是出错的原因

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

问题是编译器不能自己构造vector成员:它只知道vector一个构造函数,并且它需要三个double s用于构造,它没有。 您可以提供编译器与那些缺少构造函数参数为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. 您的vector类没有默认构造函数,因为您已经定义了一个带参数的显式构造函数。
  2. 在对象构造期间但在执行构造函数中的代码之前,将初始化一个对象的数据成员。

因此,当编译器想要创建矩阵对象时,它需要首先构造/初始化m1 / m2 / m3,因为矩阵构造函数的这些代码“{m1 = a; m2 = b; m3 = c;}”。 但是,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)) {
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM