6

我对 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: error: expected ';' 在“t”之前 classi.cpp:43:39:错误:未在此范围内声明“t”

有什么我对课程不太了解的地方吗?为什么它不能识别 taa“时间”变量?

4

3 回答 3

14

这应该教会你不要有讨厌的using指令,例如:

using namespace std;

尤其是不在命名空间范围内(如果在头文件中则更糟)。标准库中有一个名为 的函数std::time(),其名称与您的类型名称冲突。

这种歧义可以通过class在声明中使用关键字来解决t

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();

当然,这同样适用于所有类似的表达方式

于 2013-06-23T14:00:44.713 回答
3

你不应该为你的班级命名time,或者你应该避免使用using namespace std. 相反,您可以执行诸如using std::cout,using std::endl等语句。我个人从不使用“使用”,始终保留 std::,它使我在源代码中的搜索更容易。

无论如何,我在这里检查过,删除using namespace std并没有真正帮助(见上面的讨论)。安全起见并更改班级名称。无论如何,上述建议仍然存在。

于 2013-06-23T14:01:05.600 回答
3

删除“using namespace 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;
}

那是因为这些函数正在返回 void。另一种方法是让这些函数返回 std::string 。

希望这提供了另一种见解。

干杯,

西蒙。

于 2013-06-23T22:30:37.410 回答