如何退出某个功能,但继续我的其余程序

时间:2017-04-13 01:35:22

标签: c++

从我从谷歌教授那里收集到的,只需使用return。但是我的编译器告诉我必须返回一个值(我使用Visual Studio Community 17)。

基本上,我有一个执行矩阵乘法的重载*运算符。我已对该程序进行了测试,运行得很好。但是,如果用户试图传递没有定义产品的矩阵,我想添加一些条件。

/*
    overloaded * operator allows proper matrix multiplication
*/
Matrix Matrix::operator*(const Matrix &right)
{
    if (cols== right.rows)
    {
        Matrix temp(rows, right.cols);
        for (int i = 0; i < rows; ++i)
            for (int j = 0; j < right.cols; ++j)
                for (int k = 0; k < cols; ++k)
                    temp.matrix[i][j] += matrix[i][k] * right.matrix[k][j];

        return temp;
    }

    else
    {
        cout << "You can only multiply matrices if the number of columns of matrix A is equal to the number of rows of matrix B\n"
             << "Try changing the attributes of your matrix\n";

        return;
    }
}

4 个答案:

答案 0 :(得分:1)

您的函数目前正在关注:它正常执行自包含数据操作,但在错误情况下它直接写入cout - 这不是您应该如何设计软件。

在惯用的C ++中,您的程序应该throw一个std::exception对象或子类。对于这种特殊情况,我建议std::runtime_error

您的代码应如下所示:

using namespace std;

...

Matrix Matrix::operator*(const Matrix &right)
{

    if( this->rows != right.cols ) {

        throw runtime_error("Invalid 'right' argument.");
    }

    // continue as normal
}

然后应该使用try/catch块包裹调用:

Matrix newMatrix;
try {

    newMatrix = leftMatrix * rightMatrix;
}
catch(runtime_error& e) {

    cout << e.what() << endl;
}

观察该函数不再关注 错误的显示方式 - 代码的使用者现在可以通过cout或其他方式自由显示错误消息,例如作为Web应用程序,错误日志文件,GUI消息框等。

答案 1 :(得分:1)

所以你有:

Matrix a,b;
Matrix c=a*b;

由于维度不匹配导致c=a*b没有意义,您希望程序的状态在a*b行之后是什么样的?

有一些不错的答案。

其中一个是打印错误并结束程序。

其中一个是抛出异常。

其中一个是用它们的大小来扩充矩阵的类型,并且只有在尺寸匹配时才使c=a*b编译。

其中一个是记录错误并返回某种“null”矩阵,或者包含错误的矩阵。

其中一个是让*返回一个Maybe类型(如std::optionalstd::experimental::expected),然后强制调用者决定如何处理失败(这只是以上,但有一个单独的模板来处理可空/错误monad而不是将其烘焙到Matrix本身。)

其中一个是调用全局或本地安装的错误回调,它决定使用上述哪一个。

在C ++中,您必须决定如何处理错误。该语言不适合您。但这个决定很重要,而且没有一个正确的答案。

答案 2 :(得分:0)

如果编译器告诉您返回值,请尝试在第二个return语句中使用return 0以及设置全局标志。这样你可以检查矩阵是否有效而不会产生错误的答案。

答案 3 :(得分:0)

编译器会要求您在函数中返回一个值,因为运算符必须返回一个值。

else部分,如果您需要管理异常,如果您没有在proramming中到达那里,那么只返回一个情感矩阵(您的函数的返回类型)