C++ 错误:在';之前需要构造函数、析构函数或类型转换';代币
我不断地犯这个错误,我不知道如何克服它。我是一个初学者,正在尝试构建一个代码来练习操作符重载。首先,我有一个错误,说对FeetInches有一个未识别的引用(unsigned int=0,int=0)。然后我试着实现构造函数,结果却出现了那个错误C++ 错误:在';之前需要构造函数、析构函数或类型转换';代币,c++,debugging,operator-overloading,C++,Debugging,Operator Overloading,我不断地犯这个错误,我不知道如何克服它。我是一个初学者,正在尝试构建一个代码来练习操作符重载。首先,我有一个错误,说对FeetInches有一个未识别的引用(unsigned int=0,int=0)。然后我试着实现构造函数,结果却出现了那个错误 #include<iostream> #include<cstdlib> using namespace std; class FeetInches { private: unsigned int feet; in
#include<iostream>
#include<cstdlib>
using namespace std;
class FeetInches
{
private:
unsigned int feet;
int inches;
void simplify();
public:
FeetInches(unsigned int= 0, int= 0);
FeetInches operator+(const FeetInches &);
void display();
};
void FeetInches::simplify()
{
if (inches >=12)
{
feet+= (inches/12);
inches = inches % 12;
}// end of IF
else if (inches <0)
{
feet-=((abs(inches)/12)+1);
inches = 12-(abs(inches)%12);
}// end of elseif
}// end of simplify
FeetInches FeetInches::operator+(const FeetInches & right)
{
FeetInches one (10,15);
FeetInches ruler(5,3);
FeetInches temp;
temp=one+ruler;// temp one.operator +(ruler)
temp.display();
}
FeetInches::FeetInches(feet =0,inches=0)
{
}
void FeetInches::display()
{
cout << "F: " << feet << " I:" << inches << endl;
}
int main()
{
FeetInches aMeasure;
aMeasure.display();
return 0;
};
#包括
#包括
使用名称空间std;
课堂气氛
{
私人:
无符号整数英尺;
整数英寸;
无效简化();
公众:
FeetInches(无符号int=0,int=0);
FeetInches运算符+(const FeetInches&);
void display();
};
void FeetInches::simplify()
{
如果(英寸>=12)
{
英尺+=(英寸/12);
英寸=英寸%12;
}//IF结束
else if(inches语法应为
FeetInches(unsigned int feet = 0, int inches = 0);
为了声明,而不是
FeetInches::FeetInches(unsigned int feet, int inches)
: feet(feet), inches(inches)
{ }
在定义中
原因是技术上的,不是逻辑上的,它们取决于C++如何在较低的层次上实现。
参数的默认值是由函数的“强>调用方< /强>提供的,因此它们必须在函数的<强>声明< /强>中指定,因为在C++中,编译器编译时调用它时,不能保证函数的实现。
这很明显,你没有。将构造函数主体附加到代码中,为此,您可以编写以下代码:
class type_name{
public :
type_name (...ARGS...){ ... }
};
还是这个
class type_name{
public :
type_name (...ARGS...);
};
type_name(... ARGS ...){ ...body.. }
因此,您需要附加正文,否则链接器将无法生成二进制文件,这就是它背后发生的事情:
1-然后调用编译器为您编写的每个{.c/.cpp/.cxx…}生成一个.obj文件。
2-然后调用链接器来创建最终输出,为此他需要在任何.obj文件中找到每个被调用函数的引用。如果您只编写函数声明,而您不调用它,链接器可能只会发出警告,但如果您调用它,他需要找到它的代码。因为他需要用代码addre替换调用如果没有代码,他会给你一个不确定的引用错误
对于每个函数代码,都有一个标头,告诉您要传递给此代码的arrguments nember类型。他告诉您如何查找函数体。您在声明中写道“FeetInches(unsigned int=0,int=0);”这就是头,您稍后使用这些参数调用了函数,然后链接器需要找到对应于该头的代码,但他没有找到,因为在实现中您没有附加类型
(事实上不止这些,但这正是你现在需要知道的,链接器添加了一些额外的参数…)
在这里您可以找到有关此主题的更多信息
注意:只将默认值放在声明中(类内),不要在声明外重复,事实上,现代编译器不会接受您编写的内容并指定错误(至少在命令行中使用默认复制参数时是这样),并在将主体放在类外部时添加参数类型,以确保编译器能够找到它