我对C编程比较陌生.我正在研究类如何工作,我遇到以下代码的问题:
@H_403_2@#include <iostream>
using namespace std;
class time
{
public:
time();
void settime (int,int,int);
void printuniversal ();
void printstandard ();
private:
int hour;
int minute;
int second;
};
time::time()
{
hour = minute = second = 0;
}
void time::settime (int h,int m,int s)
{
hour = (h >= 0 && h < 24) ? h : 0;
minute = (m >= 0 && m < 60) ? m : 0;
second = (s >= 0 && s < 60) ? s : 0;
}
void time::printuniversal()
{
cout << hour << ":" << minute << ":" << second << ":" << endl;
}
void time::printstandard()
{
cout << ((hour == 0 || hour == 12) ? 12 : hour % 12) << ":" << minute << ":" << second << (hour < 12 ? "AM" : "PM") << endl;
}
int main ()
{
time t;
cout << "Initial universal time: " << t.printuniversal();
cout << "\nInitial standard time: " << t.printstandard();
t.settime(13,27,6);
cout << "\nNew universal time: " << t.printuniversal();
cout << "\nNew standard time: " << t.printstandard();
return 0;
}
我得到的错误是:
classi.cpp:42:6:错误:预期’;’在’t’之前
classi.cpp:43:39:错误:’t’未在此范围内声明
有什么我对课程不太了解吗?为什么它不识别“时间”变量?
解决方法
这应该教你不要使用令人讨厌的使用指令,例如:
@H_403_2@using namespace std;
尤其不是在命名空间范围内(如果在头文件中更糟糕).标准库中有一个名为std::time()
的函数,其名称与您的类型名称冲突.
这种歧义可以通过在t的声明中使用class关键字来解决:
@H_403_2@class time t;但是,更好的方法是删除using指令并从标准命名空间中限定实体的名称,从而编写(例如):
@H_403_2@std::cout << "Initial universal time: " // ^^^^^请注意,这可能还不够,因为允许库实现将C标准库中的实体放在全局命名空间中.在这种情况下,删除讨厌的using指令无助于解决歧义.
因此,我还建议避免让自己的实体(类型,函数,变量……)与标准库中的实体同名,或者至少将它们放在您自己的命名空间中.
而且,表达式如:
@H_403_2@cout << "Initial universal time: " << t.printuniversal(); // ^^^^^^^^^^^^^^^^^^^^^ // printuniversal() returns void!由于printuniversal()返回void,因此格式错误.你应该这样做:
@H_403_2@cout << "Initial universal time: "; t.printuniversal();当然,这同样适用于所有类似的表达