C++类内使用自定义带参构造类成员报错无匹配无参构造如何解决
问题根本原因
你的推测是正确的:C++规定,当类的成员变量是自定义类类型且该类没有无参默认构造函数时,必须在外层类的构造函数初始化列表中完成该成员的初始化,不能放到构造函数体里赋值。你现在把first_hidden_weights、output_weights、output_biases的赋值写在NeuralNewtork构造函数的函数体里,编译器会在进入函数体之前先尝试调用这三个成员的无参构造函数,而你的Matrix2D只提供了接收两个int的构造函数,没有无参构造,因此触发编译报错。
可选解决方案
方案1:使用构造函数初始化列表初始化成员(更推荐,符合C++规范,性能更好)
直接修改NeuralNewtork的构造函数,把三个Matrix2D类型的成员放到初始化列表里初始化,修改后的构造函数代码如下:
NeuralNewtork(int input_nodes, int hidden_layers, int hidden_nodes, int output_nodes) : numberof_input_nodes(input_nodes), numberof_hidden_layers(hidden_layers), numberof_hidden_nodes(hidden_nodes), numberof_output_nodes(output_nodes), // 在这里初始化三个没有默认构造的Matrix2D成员 first_hidden_weights(hidden_nodes, input_nodes), output_weights(output_nodes, hidden_nodes), output_biases(output_nodes, 1) { // 函数体里不需要再做赋值,直接调用随机化方法即可 first_hidden_weights.randomizeMatrix(); hidden_weights.reserve(numberof_hidden_layers-1); for (int i=0; i<numberof_hidden_layers-1; i++){ hidden_weights.push_back(Matrix2D(numberof_hidden_nodes, numberof_hidden_nodes)); hidden_weights.back().randomizeMatrix(); } output_weights.randomizeMatrix(); hidden_biases.reserve(numberof_hidden_layers); for (int i=0; i<numberof_hidden_layers; i++){ hidden_biases.push_back(Matrix2D(numberof_hidden_nodes, 1)); hidden_biases.back().randomizeMatrix(); } output_biases.randomizeMatrix(); }
方案2:给Matrix2D类补充无参默认构造函数
如果你不想修改初始化列表,也可以给Matrix2D加一个无参的默认构造函数,让编译器可以默认构造这三个成员,后续在函数体里赋值即可,补充代码如下:
class Matrix2D{ public: int rows = 0; int columns = 0; vector<vector<float> > matrix; // 新增无参默认构造函数 Matrix2D() = default; // 原有两个int参数的构造函数保留 Matrix2D(int x, int y){ rows = x; columns = y; for (int i = 0; i < rows; i++) { vector<float> v1; for (int j = 0; j < columns; j++) { v1.push_back(0); } matrix.push_back(v1); } } // 其余原有成员函数保持不变 };
额外隐藏Bug提醒
你当前代码中Matrix2D::matrixMultiplication静态函数存在逻辑错误,内层循环变量写错了,会导致运行时崩溃/死循环:
// 原错误代码 for (int k = 0; k < x.columns; i++) { sum += x.matrix[i][k] * y.matrix[k][j]; } // 修改为 for (int k = 0; k < x.columns; k++) { sum += x.matrix[i][k] * y.matrix[k][j]; }
内容的提问来源于stack exchange,提问作者SnowballAvocado
相关产品推荐
相关产品推荐

