You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 19:27:01