使用另一个类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之前的版本中)使用此表单初始化非静态常量数据成员
- 必须使用此表单初始化引用数据成员
此外,请注意,还有std::vector
,您可能需要重命名自己的向量以避免命名冲突,最好通过const引用传递vector
。
以下是出现问题的原因:
对象的构造分为多个阶段。对于矩阵类,首先需要构造所有成员对象,并且仅,然后执行构造函数主体。这里需要认识到的重要一点是,在输入构造函数主体之前,所有成员对象(在您的案例中为m1
、m2
和m3
)都必须已经构造好。
问题是编译器不能自己构造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;
}
};
出现此错误的原因是:
- 您的向量类没有默认构造函数,因为您定义了一个带参数的显式构造函数
- 一个对象的数据成员将在对象构造期间初始化,但在构造函数中的代码执行之前初始化
因此,当编译器想要创建矩阵对象时,它需要在矩阵构造函数的这些代码"{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。这是因为:
- 当没有定义时,编译器将提供"默认复制构造函数"(实际上只是针对您的情况的逐位复制)
- 这个"默认副本构造函数"可以通过成员初始化列表调用
或者使用"推荐的c++11"方式:
matrix (vector a, vector b, vector c)
: m1(std::move(a)),m2(std::move(b)),m3(std::move(c)) {
}
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 运行同一解决方案的另一个项目的项目
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- C++从另一个类访问公共静态向量的正确方法是什么
- C++-试图将函数指针推回到另一个CPP文件中的矢量时出错
- 使用std::transform将一个范围的元素添加到另一个范围中
- 输入到文件并输出到另一个文件,并将流文件传递给函数
- 我可以将一个用clang c++11编译的对象与另一个用c++17编译的对象链接起来吗
- 修改函数中的指针(将另一个指针作为参数传递)
- 为什么我不能将一个对象push_back到属于另一个类的对象向量中?
- C++试图读取一个文件并输出到另一个文本文件
- 如何将指针从一个void函数传递到另一个C++
- 如何从另一个文件继承私有成员变量和公共函数
- 使用.find函数在c++中查找字符和另一个字符之间的大小
- 在 Windows 上,是否可以让 dll 在不使用 PATH 环境变量的情况下在另一个文件夹中查找依赖项?
- 在他自己的方法中,有可能将一个对象取消引用到另一个对象吗
- C++-我可以创建另一个类的成员并在构造函数中使用它吗
- 如何在C++中将函数发送到另一个进程
- 如何通过按下第三个窗口中的按钮,将QString从一个窗口获取到另一个窗口