【问题标题】:How do I improve the following piece of code in constructor method?如何改进构造方法中的以下代码?
【发布时间】:2021-06-01 23:29:06
【问题描述】:
auto MyName = "Luffy";
for (auto &student: students)
{
    if (student.name == MyName)
    {
        m_student_info = &student;
    }
}

students 是一个结构,其名称和卷号在某处声明并带有值。如何在构造函数中改进这段代码? return 不能在构造函数内部使用。即使 student.name 找到匹配项,它仍然会继续循环运行,如何避免这种情况?

【问题讨论】:

  • "return 不能在构造函数中使用" - 是这样吗?你试过return;吗?
  • break;if 中怎么样?如果你想在循环后继续函数。
  • 你不能返回一个值,但你当然可以从构造函数返回。
  • 是的,我试过了。构造函数不期望返回值。我只需要将值初始化/分配给 m_student_info。
  • @Luffy555 - 不,不返回。只需返回,就像从 void 函数中一样

标签: c++ c++11 constructor


【解决方案1】:

break; 指令用于立即停止循环的执行。它也适用于其他循环,例如 while

构造函数的主要改进是在 if 末尾添加 break,如果您希望在找到匹配项后停止循环。

请注意,break 不会退出函数 - 只是循环。

【讨论】:

    【解决方案2】:

    你可以用函数初始化成员

    Student* find_student(std::string name, Students & students)
    {
        auto it = std::find_if(students.begin(), students.end(), [&name](auto & student){ return student.name == name; });
        return (it != students.end()) ? &*it : nullptr;
    }
    
    Thing::Thing() : m_student_info(find_student("Luffy", students)) {}
    

    【讨论】:

    • m_student_info = std::find_if(std::begin(students), std::end(students), [&name](auto &student) { return student.name == name; });我有这样的代码,但如何在构造函数中完成初始化之前检查 m_student_info 是否为 nullptr?
    • 我没有将这个 find_if 与函数一起使用,而是直接在构造函数中使用。
    • 如果在构造函数中找不到,你打算怎么做?如果您不想要缺少Student 的对象,那么您需要先搜索,如果找到就构造一个。此时构造函数可以采用已知不为空的Student *
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-24
    • 2017-05-05
    • 1970-01-01
    • 2023-04-02
    • 2011-04-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多