函数未声明(首先使用此函数)
Function undeclared(first use this function)
我正在研究矩阵类,但我无法弄清楚为什么会出现此错误,因为我已经定义了有问题的函数(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.变量和方法的名称是塞尔维亚语,希望你能弄清楚。提前感谢
Dopisi
是Matrica
类中的成员函数。如果您希望它是一个独立的函数,则应在类外部声明或定义它。
如果您希望它能够访问私有成员,请将其声明为 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的新值分配新内存。
因此,运算符函数具有未定义的行为,毫无疑问,它的工作将导致程序异常。
- 函数未在作用域中声明 / 如何结合使用 header.h、header.cpp 和 main.cpp?
- 我的函数调用 (C++) 中的未声明标识符
- 未定义与已删除与未声明的函数
- C++ 在 CentOS7 中与 g++ 的 DLL 链接后未声明的函数
- 由于值返回函数中的错误,程序无法编译.它说未声明的标识符
- 为什么 C 允许我调用未声明的函数?
- 'temp'未声明,请先使用此函数
- C 如何从构造函数中声明(错误C2065未宣布的标识符)
- 函数未在此范围内声明
- 尝试使用 std::函数(未定义的符号)声明模板化类状态时出现链接错误
- makefile 和 lex+yacc 中的错误 -> 错误:"noyywrap"未声明(在此函数中首次使用)
- 我们如何有证据表明,声明虚拟函数的类是2个字节,其中一个不超过一个未声明,而在子类中
- 函数参数中未声明和未定义的标识符
- 在此范围错误中未声明函数错误
- 类 'MainWindow' 中未声明任何成员函数
- 错误C2509:成员函数未在派生类中声明
- C++成员函数未声明错误时(当它看起来是错误时)
- 函数未声明(首先使用此函数)
- 函数未声明简单程序
- 无法调用 VBO 实现所需的函数...未声明错误