我是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()'
我猜这个程序不知道如何使用我定义的矢量类构造矩阵。 但是我不明白为什么。如果有人能解释,我将非常感激。
答案 0 :(得分:6)
您需要按成员初始化列表初始化m1,m2,m3
成员:
matrix (const vector& a, const vector& b, const vector& c)
: m1(a),m2(b),m3(c)
请注意以下事项:
另外,请注意,有std::vector
,您可能希望将自己的向量重命名为void命名冲突,并且最好通过const引用传递vector
。
答案 1 :(得分:4)
这是为什么这是错误的:
对象的构建分多个阶段进行。对于矩阵类,首先需要构造所有成员对象,然后只有然后执行构造函数体。这里要认识到的重要一点是,在输入构造函数体之前,必须构造所有成员对象(在您的情况下为m1
,m2
和m3
)。
问题是编译器不能自己构造vector
成员:它只知道vector
的一个构造函数,并且需要三个double
来构造它,它不会有。根据billz的回答,您可以使用初始化列表语法为编译器提供vector
缺少的构造函数参数。
这是有效的,因为初始化列表在启动的成员构建阶段执行,这发生在构造函数体之前。
或者,为vector
提供默认构造函数,以便编译器能够自动构造矩阵成员而无需其他信息,如Zac的回答所示。
答案 2 :(得分:1)
需要类向量的默认构造函数,没有参数的构造函数:
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;
}
};
答案 3 :(得分:0)
你遇到这个错误的原因是:
因此,当编译器想要创建矩阵对象时,需要首先构造/初始化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。这是因为:
答案 4 :(得分:0)
或者使用&#34;推荐的c ++ 11&#34;方式:
matrix (vector a, vector b, vector c)
: m1(std::move(a)),m2(std::move(b)),m3(std::move(c)) {
}