函数编译时出错,说没有适合的默认构造函数可使用,自己加了个构造函数,又说函数重载有歧义,我郁闷了,C++新手,求指教!!!
#include <iostream>
#include <iomanip>
using namespace std;
class MYTIME{
public:
static bool IsValid(int, int, int);
MYTIME(int, int, int);
void Input();
void Output()const;
private:
int hour, minute, second;
};
bool MYTIME::IsValid(int hour, int minute, int second)
{
return (hour >= 0 && hour <= 12)&&(minute >= 0 && minute <= 60)&&(second >= 0 && second <= 60);
}
MYTIME::MYTIME(int hour = 0, int minute = 0, int second = 0):hour(hour), minute(minute), second(second)
{
if(!IsValid(hour, minute, second))
{
cout<<"不正确的参数!"<<endl;
exit(EXIT_FAILURE);
}
}
void MYTIME::Input()
{
char c1, c2;
while(cin>>hour>>c1>>minute>>c2>>second, !cin||!IsValid(hour, minute, second)||c1 != ':'||c1 != c2)
{
cout<<"不正确的时间,请重新输入:";
if(!cin)cin.clear();//清错误标记
cin.sync();//清缓冲区
}
}
void MYTIME::Output()const
{
cout<<setfill('0')<<setw(2)<<hour<<":"<<setfill('0')<<setw(2)<<minute<<":"<<setfill('0')<<setw(2)<<second;
}
int main()
{
/*const MYTIME a(0, 0, 0);//定义常对象时必须进行初始化
cout << "a = "; a.Output(); cout << endl;
const MYTIME b(8);
cout << "b = "; b.Output(); cout << endl;
const MYTIME c(9, 15);
cout << "c = "; c.Output(); cout << endl;
const MYTIME d(10, 30, 45);
cout << "d = "; d.Output(); cout << endl;*/
MYTIME a;
cout << "a = ? "; a.Input();
cout << "a = "; a.Output(); cout << endl;
return 0;
}
这是我没加构造函数之前的,后来自己加了一个无参数的构造函数,赋了三个数据成员初值,结果就说函数重载有歧义,是怎么回事啊
这是我后来自己加的构造函数
MYTIME::MYTIME():hour(0), minute(0), second(0)
{
}
是哪里出错了呢?求指教! C++ 构造函数
[解决办法]
MYTIME::MYTIME():hour(0), minute(0), second(0)
MYTIME::MYTIME(int hour = 0, int minute = 0, int second = 0):hour(hour), minute(minute), second(second)
这两个函数无法区分
都是可以不用参数就可以调用
改成这样看看
MYTIME::MYTIME(int hour, int minute = 0, int second = 0):hour(hour), minute(minute), second(second)
[解决办法]
把 MYTIME(int, int, int); 的声明和定义(以及默认参数)合并在一起。
[解决办法]
MYTIME::MYTIME(int hour = 0, int minute = 0, int second = 0):hour(hour), minute(minute), second(second) //定义的时候加默认参数?这肯定报错 默认参数请放到声明中.
[解决办法]
#include <iostream>
#include <iomanip>
using namespace std;
class MYTIME{
public:
static bool IsValid(int, int, int);
MYTIME();
MYTIME(int, int, int);
void Input();
void Output()const;
private:
int hour, minute, second;
};
bool MYTIME::IsValid(int hour, int minute, int second)
{
return (hour >= 0 && hour <= 12)&&(minute >= 0 && minute <= 60)&&(second >= 0 && second <= 60);
}
MYTIME::MYTIME():hour(0),minute(0),second(0)
{
}
MYTIME::MYTIME(int hour , int minute , int second ):hour(hour), minute(minute), second(second)
{
if(!IsValid(hour, minute, second))
{
cout<<"不正确的参数!"<<endl;
exit(EXIT_FAILURE);
}
}
void MYTIME::Input()
{
char c1, c2;
while(cin>>hour>>c1>>minute>>c2>>second, !cin
[解决办法]
!IsValid(hour, minute, second)
[解决办法]
c1 != ':'
[解决办法]
c1 != c2)
{
cout<<"不正确的时间,请重新输入:";
if(!cin)cin.clear();//清错误标记
cin.sync();//清缓冲区
}
}
void MYTIME::Output()const
{
cout<<setfill('0')<<setw(2)<<hour<<":"<<setfill('0')<<setw(2)<<minute<<":"<<setfill('0')<<setw(2)<<second;
}
int main()
{
/*const MYTIME a(0, 0, 0);//定义常对象时必须进行初始化
cout << "a = "; a.Output(); cout << endl;
const MYTIME b(8);
cout << "b = "; b.Output(); cout << endl;
const MYTIME c(9, 15);
cout << "c = "; c.Output(); cout << endl;
const MYTIME d(10, 30, 45);
cout << "d = "; d.Output(); cout << endl;*/
MYTIME a;
cout << "a = ? "; a.Input();
cout << "a = "; a.Output(); cout << endl;
return 0;
}
贴主 看看这个 主要是你的
MYTIME::MYTIME(int hour = 0, int minute = 0, int second = 0):hour(hour), minute(minute), second(second)这句代码已经规定了 没有参数的时候默认用0,所以你又定义一个无参构造函数 会造成歧义
[解决办法]
lz的问题不是ls各位说的那样
关键点在于默认参数是要放在声明的地方,而不是定义的地方
你在
MYTIME::MYTIME(int hour = 0, int minute = 0, int second = 0)写上默认参数是没有用的,要在类定义里面构造函数声明的地方写上默认参数才有用
[解决办法]
不要死读书好么
你将构造函数A的参数全设成默认了,那么MYTIME()就表示是用的这个构造函数,
你又设了一个无参数的B,那么编译器就不知道MYTIME()是表示A还是B了