【问题标题】:C++ C'tor does not initialize fields?C++ C'tor 不初始化字段?
【发布时间】:2021-07-26 18:59:50
【问题描述】:

我在 C++11 中写道:

JobsList::JobEntry::JobEntry(pid_t pid, pid_t jid, const string &cmd, bool is_stopped) : pid(pid), jid(jid), cmd(cmd),
                                                                                         is_stopped(is_stopped) {
    time(&insertion_time);
}

但是编译器一直给我警告:

Clang-Tidy: Constructor does not initialize these fields: insertion_time

我怎样才能摆脱这个并初始化 in_time?

【问题讨论】:

  • 显示一些 minimal reproducible example - 一个完整的(但减少的)C++ 翻译单元。在此之前,请阅读 this C++ reference 和好的 C++ programming book
  • 它不是编译器,它是clang-tidy,一个静态分析工具,给你这个警告。估计是假阳性。你可以压制它。
  • @yeputons 我不能在初始化列表中调用时间函数吗?
  • @stacker 你不能。您可以使用立即调用的 lambda 表达式,但它看起来很难看。最好制作自己的 time() 包装器,它返回 time_t 而不是使用输出参数,然后调用它。

标签: c++ c++11 constructor initialization


【解决方案1】:

你有一个初始化列表,你没有在其中初始化insertion_time

在构造函数的主体中,在字段初始化之后,通过调用time() 设置insertion_time 的值。

然后,Clang-Tidy 会警告您该字段尚未初始化但正在使用中。

你可以用类似这样的东西来初始化它:

 JobsList::JobEntry::JobEntry(pid_t pid, pid_t jid, const string &cmd, bool is_stopped) : pid(pid), jid(jid), cmd(cmd), is_stopped(is_stopped), insertion_time(0) {
    time(&insertion_time);
}

编辑:

您可以在初始化列表中使用time(),但不能使用time(&insertion_time)。您必须改为致电insertion_time(time(nullptr))time() 函数返回正确的值:

JobsList::JobEntry::JobEntry(pid_t pid, pid_t jid, const string &cmd, bool is_stopped) : pid(pid), jid(jid), cmd(cmd), is_stopped(is_stopped), insertion_time(time(nullptr)) {
}

【讨论】:

  • 初始化列表中不能调用时间函数吗?
  • 谢谢,最后什么时间(&insertion_time) 返回?
  • 用于设置insertion_time 的值相同。阅读手册。
  • 所以我们可以用 insert_time(time(insertion_time)) 替换您的编辑?
  • 不,不要。你为什么要这样的东西。我的提议会初始化你的字段,你还期待什么?
【解决方案2】:
time_t time (time_t* timer);

所以time 返回一个time_t

JobsList::JobEntry::JobEntry(pid_t pid, pid_t jid, const string &cmd, bool is_stopped) : pid(pid), jid(jid), cmd(cmd), is_stopped(is_stopped), 
insertion_time(time(nullptr)) {
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-27
    • 2015-04-16
    • 1970-01-01
    • 1970-01-01
    • 2020-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多