C++;类和变量 我对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; } #包括 使用名称空间std; 上课时间 { 公众: 时间(); 无效设置时间(int,int,int); void printuniversal(); 无效打印标准(); 私人: 整小时; 整数分钟; int秒; }; 时间::时间() { 小时=分钟=秒=0; } 无效时间::设置时间(inth,intm,ints) { 小时=(h>=0&&h=0&&m=0&&s构造成,但是现在,20年后,我绝对不使用使用命名空间STD< /Code >,它使代码读起来更容易,而且使代码编译得更干净(避免了上面的名称冲突)。这非常有效,谢谢。我告诉过你,在编程方面我还是个新手。:)我不知道使用名称空间std可能会引起冲突。@AndreaDePace:我们都在那里;)很高兴helped@AndyProwl选中后,它看起来不像time是一个在包含后可以自由用作类名的词。@Antonio:这可能是因为该实现将time().无论如何,正如我在回答中提到的,最好不要给出与标准中实体名称冲突的实体名称library@Antonio:可能是向后兼容C,简化了库实现者的生活。但是,对我们来说,这不是一件好事 int main () { my_code::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; }
这应该教会您不要使用下流的C++;类和变量 我对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; } #包括 使用名称空间std; 上课时间 { 公众: 时间(); 无效设置时间(int,int,int); void printuniversal(); 无效打印标准(); 私人: 整小时; 整数分钟; int秒; }; 时间::时间() { 小时=分钟=秒=0; } 无效时间::设置时间(inth,intm,ints) { 小时=(h>=0&&h=0&&m=0&&s构造成,但是现在,20年后,我绝对不使用使用命名空间STD< /Code >,它使代码读起来更容易,而且使代码编译得更干净(避免了上面的名称冲突)。这非常有效,谢谢。我告诉过你,在编程方面我还是个新手。:)我不知道使用名称空间std可能会引起冲突。@AndreaDePace:我们都在那里;)很高兴helped@AndyProwl选中后,它看起来不像time是一个在包含后可以自由用作类名的词。@Antonio:这可能是因为该实现将time().无论如何,正如我在回答中提到的,最好不要给出与标准中实体名称冲突的实体名称library@Antonio:可能是向后兼容C,简化了库实现者的生活。但是,对我们来说,这不是一件好事 int main () { my_code::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; },c++,class,C++,Class,这应该教会您不要使用下流的指令,例如: using namespace std; cout << "Initial universal time: " << t.printuniversal(); // ^^^^^^^^^^^^^^^^^^^^^ // printuniversal() returns void! 在标准库中有一个名为的函数
指令,例如:
using namespace std;
cout << "Initial universal time: " << t.printuniversal();
// ^^^^^^^^^^^^^^^^^^^^^
// printuniversal() returns void!
在标准库中有一个名为的函数,其名称与您的类型名称冲突
这种歧义可以通过在t
声明中使用class
关键字来解决:
class time t;
但是,更好的方法是使用
指令删除,并从标准名称空间中限定实体名称,从而编写(例如):
格式错误,因为printuniversal()
返回void
。您只需执行以下操作:
cout << "Initial universal time: ";
t.printuniversal();
cout你不应该给你的类命名time
,或者你应该避免使用名称空间std
。相反,你可以使用std::cout
,使用std::endl
等语句。我个人从不使用“using”,总是保留std:,这样可以更方便我在源代码中搜索
无论如何,我检查过,删除使用名称空间std
并没有真正的帮助(请参见)。请注意安全,并将名称更改为类。无论如何,上述建议仍然有效。删除“使用名称空间std”指令的另一种方法是将代码放置在名称空间中,以避免名称冲突。这可以按如下方式完成:
namespace time_utils
{
class time
{
public:
time();
void settime (int, int, int);
void printuniversal ();
void printstandard ();
private:
int hour;
int minute;
int second;
};
};
time_utils::time::time()
{
hour = minute = second = 0;
}
名称空间的目的是避免名称冲突
稍后,在cout流中调用函数时会出现编译错误,因此您可以按如下方式拆分它们:
int main ()
{
my_code::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;
}
int main()
{
我的代码::时间t;
您是否应该避免使用命名空间std
。有一个名为std::time
的类可能与time
类冲突。这可能不是问题所在,但最好不要引发此类问题。是的,首先将类重命名为不太通用的类,以消除名称冲突的可能性。实际上y、 我相信@juanchopanza一针见血。我将time
重命名为xtime
,它不再抱怨这一行(而是抱怨void
函数被传递给cout
@matstpeterson-Ha的结果,我已经说过很多次了“不要使用使用名称空间std
,即使是在.cpp
文件中,我也会与那些声称这样做很好的人进行愚蠢的斗争。我甚至想过用反例开始一个博客…:-)最初,用C++开始时,我使用命名空间…< /Code >构造成<代码>,但是现在,20年后,我绝对不使用<代码>使用命名空间STD< /Code >,它使代码读起来更容易,而且使代码编译得更干净(避免了上面的名称冲突)。这非常有效,谢谢。我告诉过你,在编程方面我还是个新手。:)我不知道使用名称空间std可能会引起冲突。@AndreaDePace:我们都在那里;)很高兴helped@AndyProwl选中后,它看起来不像time
是一个在包含后可以自由用作类名的词。@Antonio:这可能是因为该实现将time().无论如何,正如我在回答中提到的,最好不要给出与标准中实体名称冲突的实体名称library@Antonio:可能是向后兼容C,简化了库实现者的生活。但是,对我们来说,这不是一件好事
int main ()
{
my_code::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;
}