提问人:AssistantToTheRegionalManager 提问时间:6/10/2022 最后编辑:AssistantToTheRegionalManager 更新时间:6/10/2022 访问量:68
从类内部调用非成员函数,但非成员函数将类作为输入 (C++)
Call non-member function from inside class, but the nonmember function takes class as input (C++)
问:
正如标题所暗示的那样,我想知道我是否可以从类内部调用非成员函数(包含在类头文件中),但需要注意的是非成员函数正在使用类本身?通常,我可以将非成员函数放在类声明的上方,但这意味着我不能将类作为输入传递给它,因为那时它没有被识别。
作为参考,这是我的“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);
}
有没有办法从类内部调用这个函数?我不介意它是否仍然是一个非成员函数,或者被移动到某个地方,只是想找到一种方法来做到这一点。
答:
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
评论
static
Matrix
Matrix&
matrix