【问题标题】:How can I avoid repeating code with inline functions?如何避免使用内联函数重复代码?
【发布时间】:2011-03-05 08:30:24
【问题描述】:

我的工作中有重复的代码,我想摆脱它,所以我知道在 C++ 中使用宏不是一个好主意,但我必须使用内联函数,使用这个是个好主意作为内联函数:

list<Data>::iterator foo(int data){
if(dataExists(data)){
    list<Data>::iterator i;
    for(i = dataClass.begin(); i != dataClass.end(); ++i){
       if(i->getData() == data){
        break;
       }
return i;   //here I have one more problem, what can I return if data doesn't exist?
}

我认为这个功能很不安全。如何改进我的代码?

【问题讨论】:

  • 真正需要 C# 中的宏类型功能或代码改进!

标签: c++ inline-method


【解决方案1】:

我真的不知道你在这里问什么,但你的帖子中有几个误解。

第一个内联函数是一种特定的优化,您现在还不需要关心。先了解一下普通函数,正确理解。

正如另一个答案已经说过的那样,std::find() 做了你想做的事。它不必是列表的成员才能工作,实际上现代 C++ 样式指南通常更喜欢非成员函数。

现在到您的代码。我很确定您发布的代码不是 C++ 代码,这使得您很难理解您正在尝试做什么。您使用的列表类型也不是std::list&lt;&gt;(迭代器的工作方式不同),并且您将Data 用作变量(未在您的代码中定义)和类型。

正如有人已经建议的那样,也许您应该更轻松一些,或者更好的是,为 C++ 初学者获取 good book(我推荐“加速 C++”和“使用 C++ 编程 P&P”)。

【讨论】:

    【解决方案2】:

    您发布的代码毫无意义。有一次你使用Data 作为一个类型,而在另一个时候作为一个对象。假设它是一个对象,则表示未找到某物的方法是返回一个指向其末尾的迭代器。

    return Data.end();
    

    但是您的代码太混乱了,如果不进行重大更改就无法正常工作。

    您不会通过在 SO 上发布问题来学习 C++ - 它根本无法完成。相反,您需要阅读一本好的 C++ 教科书——我推荐 Accelerated C++,它详细介绍了迭代器之类的内容。如果你继续问这样的问题,你只是在浪费你的时间,更重要的是,在浪费我们的时间。

    【讨论】:

      【解决方案3】:

      您在此处所做的事情已经由 std::find() 函数完成,因此最好使用它(尽管在练习中尝试自己实现这些东西当然没问题)。

      std::find() 还演示了一种指示“未找到”条件的好方法——如果未找到该项目,则它返回迭代器。这样,调用者可以通过将返回的迭代器与Data.end() 进行比较来确定是否找到了匹配项。

      【讨论】:

      • 不,没有std::list&lt;T&gt;::find()。但是您可以像这样使用std::find()std::find(myList.begin(), myList.end(), dataToFind)。见cppreference.com/wiki/stl/algorithm/find
      • 还有一件事:你必须#include &lt;algorithm&gt; 才能使用std::find() 和朋友。
      • +1,但在这种特殊情况下,您需要将find_if 与一个谓词一起使用,该谓词测试成员函数返回的值与您要查找的值是否相等...
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-01
      • 2011-08-29
      • 1970-01-01
      • 2021-06-20
      相关资源
      最近更新 更多