【问题标题】:C++ Member Function errors "Undeclared Identifier" when used within another Member Function在另一个成员函数中使用 C++ 成员函数错误“未声明的标识符”
【发布时间】:2012-10-03 00:48:47
【问题描述】:

我认为这是在我的声明中,但我不确定。有一个类“Matrix”,它创建 int 类型的二维数组。该类有几个重载的运算符来对类对象执行算术等。

一个要求是检查矩阵是否具有相同的维度。存储尺寸 作为两个私有整数“dx”和“dy”。

所以为了提高效率我写了一个bool类型的成员函数,如下;

bool confirmArrays(const Matrix& matrix1, const Matrix& matrix2);

是函数头,声明是;

bool Matrix::confirmArrays(const Matrix& matrix1, const Matrix& matrix2)
{
    if (matrix1.dx == matrix2.dx && matrix1.dy == matrix2.dy)
    {
        // continue with operation
        return true;

    } else {

        // hault operation, alert user
        cout << "these matrices are of different dimensions!" << endl;
        return false;
    }
}

但是当我从另一个成员函数中调用 confirmArrays 时,我得到了这个错误;

使用未声明的标识符 confirmArrays

这样调用函数;

// matrix multiplication, overloaded * operator
Matrix operator * (const Matrix& matrix1, const Matrix& matrix2)
{
    Matrix product(matrix1.dx, matrix2.dy);
    if ( confirmArrays(matrix1, matrix2) )
    {
        for (int i=0; i<product.dx; ++i) {
            for (int j=0; j<product.dy; ++j) {
                for (int k=0; k<matrix1.dy; ++k) {
                    product.p[i][j] += matrix1.p[i][k] * matrix2.p[k][j];
                }
            }
        }
        return product;

     } else {

        // perform this when matrices are not of same dimensions
    }
}

【问题讨论】:

  • 我认为需要查看您的调用代码。
  • 实际上我认为如果调用函数在confirmArrays之前声明可能会出现--很难看出它可能是什么。编辑——只是做了一点测试,顺序不重要,但还是可以试试。
  • 一个疯狂的猜测:你是从const 成员函数调用它吗?您需要将其设为const(或者更好的是static,或者可能是friend,因为它实际上并没有访问它所调用的对象)才能做到这一点。不知道它的调用方式和位置,猜测是最好的。

标签: c++ function undeclared-identifier


【解决方案1】:

您的operator* 未在Matrix 的范围内定义。您实际上已经定义了一个全局运算符。你需要

Matrix Matrix::operator * (const Matrix& matrix1, const Matrix& matrix2)
{
   ...
}

然后应该没问题。注意,如果已经编译,您将收到链接器“未定义对运算符 Matrix::operator* 的引用”错误,因为该错误未定义。

【讨论】:

  • 它被定义为朋友; friend Matrix operator * (const Matrix&amp; matrix1, const Matrix&amp; matrix2);
  • @frankV 好的,但在这种情况下,您在没有实例的情况下调用 confirmArrays。解决方案是将confirmArrays 声明为static
  • @frankV 我应该提到在这种情况下,您将不得不将其称为Matrix::confirmArrays。您也可以考虑将confirmArrays 设为全局,但如果d1d2 是私有的,则必须进行一些调整。
  • 我想让这些成员保密。 Fix 实际上也让 bool 函数成为朋友。
【解决方案2】:

bool 函数只需要支持算术函数。其中一些函数可以是成员重载运算符,有些可以是朋友。这里的技巧是将 bool 函数也定义为友元,使其可以被成员直接函数和友元函数访问,同时保留访问私有成员数据的能力。

friend bool confirmArrays(const Matrix&amp; matrix1, const Matrix&amp; matrix2);

【讨论】:

  • 这里出了点问题。如果confirmArrays 是一个非静态成员函数(Matrix 的成员),那么它就不能像operator* 那样在没有对象的情况下调用。
猜你喜欢
  • 2016-07-14
  • 2012-11-21
  • 2011-06-23
  • 1970-01-01
  • 1970-01-01
  • 2011-11-23
  • 1970-01-01
  • 2012-10-02
  • 2011-04-17
相关资源
最近更新 更多