我对C编程比较陌生.我正在研究类如何工作,我遇到以下代码的问题:
#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’未在此范围内声明
有什么我对课程不太了解吗?为什么它不识别“时间”变量?
解决方法
这应该教你不要使用令人讨厌的使用指令,例如:
using namespace std;
尤其不是在命名空间范围内(如果在头文件中更糟糕).标准库中有一个名为std::time()
的函数,其名称与您的类型名称冲突.
这种歧义可以通过在t的声明中使用class关键字来解决:
class time t;
但是,更好的方法是删除using指令并从标准命名空间中限定实体的名称,从而编写(例如):
std::cout << "Initial universal time: " // ^^^^^
请注意,这可能还不够,因为允许库实现将C标准库中的实体放在全局命名空间中.在这种情况下,删除讨厌的using指令无助于解决歧义.
因此,我还建议避免让自己的实体(类型,函数,变量……)与标准库中的实体同名,或者至少将它们放在您自己的命名空间中.
而且,表达式如:
cout << "Initial universal time: " << t.printuniversal(); // ^^^^^^^^^^^^^^^^^^^^^ // printuniversal() returns void!
由于printuniversal()返回void,因此格式错误.你应该这样做:
cout << "Initial universal time: "; t.printuniversal();
当然,这同样适用于所有类似的表达