我一直收到这个错误,我不确定如何驾驭它。我是一个初学者,并试图建立一个代码来练习运算符重载。首先我有错误说有FeetInches的未识别引用(unsigned int = 0,int = 0)。然后我尝试实现构造函数并得到该错误
#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;
};
答案 0 :(得分:1)
语法应为
FeetInches(unsigned int feet = 0, int inches = 0);
用于声明,而不是
FeetInches::FeetInches(unsigned int feet, int inches)
: feet(feet), inches(inches)
{ }
在定义中。
原因是技术性的,不合逻辑的,它们取决于C ++在较低级别的实现方式。
参数的默认值例如由函数的调用者提供,因此必须在函数的声明中指定它们,因为在C ++中它是&#39;不保证编译器在编译调用时会知道函数的实现。
答案 1 :(得分:0)
很明显,你没有将构造函数体附加到你的代码中,为此你可以这样写:
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文件中找到每个被调用函数的引用。如果你只编写一个函数声明而你没有把它称为链接器可能只会发出警告,但如果你打电话,他需要找到它的代码。因为他需要用代码地址替换调用。如果没有代码,他会给你一个未定义的引用错误。
对于每个函数代码,都有一个标题,告诉我要传递给此代码的类型的arrguments。他你那找到功能体。你在声明中写道“FeetInches(unsigned int = 0,int = 0);”这是标题,你稍后用这些参数调用函数,然后链接器需要找到与该标题对应的代码,但他没有找到它,因为在实现中你没有附加类型
(实际上它不仅仅是那个,但是你现在需要知道的是链接器增加了一些额外的参数......)
在这里,您可以找到有关此主题的更多信息http://faculty.cs.niu.edu/~mcmahon/CS241/Notes/compile.html
http://www.tenouk.com/ModuleW.html
注意:只将默认值放在声明中(在类中)并且不要在它之外重复它们,acctualy现代编译器不接受你编写的内容并指定错误(至少在命令行中使用默认的copiling参数时) ),当你把主体放在类外面时,添加参数类型以确保编译器能够找到它。