函数未声明(首先使用此函数)

Function undeclared(first use this function)

本文关键字:函数 未声明      更新时间:2023-10-16

我正在研究矩阵类,但我无法弄清楚为什么会出现此错误,因为我已经定义了有问题的函数(Dopisi())。这是我到目前为止所拥有的:

这是我到目前为止所拥有的:

#include<IOStream>
using namespace std;
class Matrica{
private:int Duzina;
    int Sirina;
    int** pok;
public:
    Matrica(){//default constructor
        Duzina=0;
        Sirina=0;
        int i,j;
        pok=new int* [Duzina];
        for(i=0;i<Duzina;i++){
            pok[i]=new int[Sirina];
        }
    }
    Matrica(int duz,int sir){//constructor
        Duzina=duz;
        Sirina=sir;
        int i,j;
        pok=new int* [Duzina];
        for(i=0;i<Duzina;i++){
            pok[i]=new int[Sirina];
            for(j=0;j<Sirina;j++){
                pok[i][j]=0;
            }
        }
    }
    void Dodaj(int i,int j){//add one element
        cout<<"Unesite element ["<<i<<"]["<<j<<"]"<<endl;
        cin>>pok[i][j];
    }
    void Popuni(){//fill entire matrix
        int i,j;
        for(i=0;i<Duzina;i++)
            for(j=0;j<Sirina;j++)
                Dodaj(i,j);
    }
    Matrica(Matrica& mat){//copy constructor
        Duzina=mat.Duzina;
        Sirina=mat.Sirina;
        int i,j;
        pok=new int* [Duzina];
        for(i=0;i<Duzina;i++){
            pok[i]=new int[Sirina];
            for(j=0;j<Sirina;j++){
                pok[i][j]=mat.pok[i][j];
            }
        }
    }
    ~Matrica(){}
    int max(int a,int b){//max value
        if(a>b)return a;
        else
            return b;
    }
    void Ispis(){//cout
        int i,j;
        for(i=0;i<Duzina;i++){
            for(j=0;j<Sirina;j++){
                cout<<pok[i][j]<<" ";
            }
            cout<<endl;
        }
    }
    Matrica& operator =(const Matrica& x){
        for(int i=0;i<Duzina;i++)
            delete pok[i];
        Duzina=x.Duzina;
        Sirina=x.Sirina;
        for(int i=0;i<Duzina;i++){
            for(int j=0;j<Sirina;j++){
                pok[i][j]=x.pok[i][j];
            }
        }
        return *this; 
    }
    Matrica Dopisi(const Matrica a,const Matrica b);
};
Matrica Matrica::Dopisi(const Matrica a,const Matrica b){//function must take two      matrices 
    int i,j,duz,sir;
    duz=max(a.Duzina,b.Duzina);
    sir=a.Sirina+b.Sirina;
    Matrica temp(duz,sir);
    for(i=0;i<a.Duzina;i++){
        for(j=0;j<a.Sirina;j++){
            temp.pok[i][j]=a.pok[i][j];
        }
    }
    for(i=0;i<b.Duzina;i++){
        for(j=0;j<b.Sirina;j++){
            temp.pok[i][j+a.Sirina]=b.pok[i][j];
        }
    }
    temp.Ispis();
    // return temp;
}
int main(){
    Matrica mat1(3,3);
    mat1.Popuni();
    mat1.Ispis();
    Matrica mat2(4,4);
    mat2.Popuni();
    mat2.Ispis();
    mat2=mat1;
    mat2.Ispis();
    Matrica mat3;
    mat3=Dopisi(mat1,mat2);
    system("pause");
    return 0;
}

P.S.变量和方法的名称是塞尔维亚语,希望你能弄清楚。提前感谢

DopisiMatrica类中的成员函数。如果您希望它是一个独立的函数,则应在类外部声明或定义它。

如果您希望它能够访问私有成员,请将其声明为 friend 函数,或使其成为static成员函数(但随后您必须将其称为 Matrica::Dopisi(...) )。

使函数

public:
static Matrica Dopisi(const Matrica &a,const Matrica &b);

然后你可以在类外称呼它为

mat3 = Matrica::Dopisi(mat1,mat2);

不需要类的实例

你调用Dopisi就好像它是一个常规函数一样。它是一个成员函数,因此需要在类 Matrica 的实例上调用。此函数的实际样式表明,作为非成员函数,它最好像当前一样调用此函数,它需要一个 Matrica 实例来调用,但也需要 2 个 Matrica 实例作为参数,并返回第四个实例。因此,您总共有 4 个实例。使用非成员函数似乎更合适,该函数获取 t 个Matrica实例并返回结果。

当然,这也需要在该函数中访问的类的私有成员的 getter/setter 函数。

您将Dopisi函数声明为类方法(将其放在类声明中),但随后将其称为全局函数。例如,它可以称为 mat3.Dopisi(mat1, mat2) .

在您的情况下,Dopisi需要有权访问Matrica类,因此只需将其设置为好友函数:

// in class declaration:
friend Matrica Dopisi(const Matrica a,const Matrica b);

// in function definition:
Matrica Dopisi(const Matrica a,const Matrica b){//function must take two      matrices

保持函数调用不变

除了函数的问题之外,类定义是无效的。首先,析构函数不会释放 pok 指向的内存。赋值运算符也不正确。

Matrica& operator =(const Matrica& x){
    for(int i=0;i<Duzina;i++)
        delete pok[i];
    Duzina=x.Duzina;
    Sirina=x.Sirina;
    for(int i=0;i<Duzina;i++){
        for(int j=0;j<Sirina;j++){
            pok[i][j]=x.pok[i][j];
        }
    }
    return *this; 
}

首先,应该delete []pok[i];而不是delete pok[i]; 此外,您没有释放已用内存并根据Duzina和Sirina的新值分配新内存。

因此,运算符函数具有未定义的行为,毫无疑问,它的工作将导致程序异常。