从类内部调用非成员函数,但非成员函数将类作为输入 (C++)

Call non-member function from inside class, but the nonmember function takes class as input (C++)

提问人:AssistantToTheRegionalManager 提问时间:6/10/2022 最后编辑:AssistantToTheRegionalManager 更新时间:6/10/2022 访问量:68

问:

正如标题所暗示的那样,我想知道我是否可以从类内部调用非成员函数(包含在类头文件中),但需要注意的是非成员函数正在使用类本身?通常,我可以将非成员函数放在类声明的上方,但这意味着我不能将类作为输入传递给它,因为那时它没有被识别。

作为参考,这是我的“Matrix”类的精简版本的样子,带有非成员函数“LUDecomposition”,我试图从“行列式”成员类中调用它:

#pragma once

#include <vector>
#include <tuple>



enum MatrixType
{
    Identity,
    Zeros,
    Ones
};



class Matrix
{
private:
    int col, row;
    typedef std::vector<double> Row;
    std::vector<Row> data;
public:
    Matrix(int columns, int rows): row(rows), col(columns), data(columns, std::vector<double>(rows)) 
    {

    }

    Matrix(int columns, int rows, MatrixType matrixType) : row(rows), col(columns), data(columns, std::vector<double>(rows))
    {
        switch (matrixType)
        {
        case Identity:
            this->MakeIdentity();
            break;
        case Zeros:
            this->Fill(0);
            break;
        case Ones:
            this->Fill(1);
            break;
        default:
            break;
        }
    }

    Row& operator[](int i)
    {
        return data[i];
    }


    std::tuple<int,int> Size() const
    {
        return std::make_tuple(col, row);
    }


    double Determinant() const
    {
        if (col != row) throw std::exception("Matrix must be square");
        Matrix tempMatrix = *this;

        std::tuple<Matrix, Matrix> LU = LUDecomposition(tempMatrix);

    }


};

std::tuple<Matrix, Matrix> LUDecomposition(Matrix& matrix) //This function decomposes input square matrix A into lower triangular matrix L and upper triangular matrix U such that A=LU (Doolittle)
{
    std::tuple<int, int> size = matrix.Size();
    int col = std::get<0>(size);
    int row = std::get<1>(size);

    Matrix lower(col, row);
    Matrix upper(col, row);

    for (int i = 0; i < col; i++)
    {
        for (int k = i; k < col; k++)
        {
            int sum = 0;
            for (int j = 0; j < i; j++)
            {
                sum += lower[j][i] * upper[k][j];
            }
            upper[k][i] = matrix[k][i] - sum;
        }

        for (int k = i; k < col; k++)
        {
            if (i == k) lower[i][i] = 1;
            else
            {
                int sum = 0;
                for (int j = 0; j < i; j++)
                {
                    sum += lower[j][k] * upper[i][j];
                }
                lower[i][k] = (matrix[i][k] - sum) / upper[i][i];
            }

        }
    }

    return std::make_tuple(lower, upper);
}

有没有办法从类内部调用这个函数?我不介意它是否仍然是一个非成员函数,或者被移动到某个地方,只是想找到一种方法来做到这一点。

C++ 参数传递 非成员函数

评论

3赞 Taekahn 6/10/2022
只需在类上方提供一个函数原型;
2赞 Ted Lyngmo 6/10/2022
您也可以让它成为staticMatrix
1赞 Ted Lyngmo 6/10/2022
顺便说一句,为什么它不是成员函数?
1赞 AssistantToTheRegionalManager 6/10/2022
@TedLyngmo我把它设为非成员,因为它需要传递给它的类本身。当它是一个成员函数时,我尝试将类传递为 *this,但无法完全让它工作。我意识到这可能有点迂回,但我对 C++ 还没有太多经验。如果您认为可以将其用作成员函数,那么我欢迎您的建议。
1赞 Ted Lyngmo 6/10/2022
但是,类本身,就像在 中一样,正是你通过普通成员函数得到的。而不是在函数内部,您只需直接使用成员变量和函数。Matrix&matrix

答:

0赞 Cycxyz 6/10/2022 #1

看起来这段代码工作正常

class A;

void func(A);

class A
{

};

void func(A) {}
0赞 John Schock 6/10/2022 #2

您需要执行两次转发声明。一个用于 Matrix 类,一个用于 LUDecomposition 函数。

class Matrix; // This lets LUDecomposition know a Matrix type exists
std::tuple<Matrix, Matrix> LUDecomposition(Matrix& matrix); // this lets the Matrix class knows that a LUDecomposition function exists.

把它们放在类和函数的定义之前(例如下面),它就会编译。enum MatrixType