功能未声明(首先使用此功能)

时间:2013-12-18 17:45:06

标签: c++

我正在研究Matrix类,但我无法弄清楚为什么我得到这个错误,因为我已经定义了有问题的函数(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.变量和方法的名字都是塞尔维亚语,希望你能弄明白。提前谢谢

5 个答案:

答案 0 :(得分:2)

DopisiMatrica类中的成员函数。如果你想让它成为一个独立的功能,它应该在外面类中声明或定义。

如果您希望它能够访问私有成员,则将其声明为friend函数,或将其设置为static成员函数(但是您必须将其称为{{1} }})。

答案 1 :(得分:1)

制作功能

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

然后你可以在课外叫它

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

不需要类的实例

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

您将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

...

//保留你的函数调用

答案 4 :(得分:0)

除了函数问题外,类定义无效。首先,析构函数不释放由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的新值释放已用内存并分配新内存。

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