在 c++ 中使用函数或类来完成简单的任务

Using a function or class in c++ for a simple task?

本文关键字:简单 任务 c++ 函数      更新时间:2023-10-16

我想在我的程序中编写一个实用程序,可以将字符串转换为 int。我知道我可以使用它 atoi 或 strtol,但我需要对它进行一些错误处理。哪种方法更好?我应该创建一个简单的全局函数,也许只在特定命名空间中,还是创建一个具有可以为我完成它的成员的类?

例如:

    namespace utility{
        int ConvertStrToInt(std::string* str, int& convertednum)
        {
          //do the conversion and error handling
        return convertednum;
        }
    }

    class Utility{
    public:
        static int ConvertStrToInt(std::string* str, int& convertednum)
        {//do the conversion and error handling here} 
    }

对不起,如果这个问题听起来有点傻,但我和另外 2 个人在一个团队中,我们对此的看法非常不同。 1 说类是针对一切的,并为一切制作类,我认为对于这么简单的问题,一个简单的函数是一个很好的解决方案。

那么哪个更有效率呢?我什么时候应该使用一个简单的函数,什么时候从哪里类是好的解决方案?

谢谢大家!

你上面写下来的类Utility在某种程度上与面向对象编程背后的思想相矛盾,因为该方法既不使用也不依赖于类的任何成员。 类应该是在这些属性上具有某些属性和方法的对象。

如果在转换中使用状态很有用,请使用类。 最好是一个函子,以便您可以将实例作为可调用实体传递。如果没有状态,则使用函数。

顺便说一句,您的签名和返回类型可能如下所示:

int ConvertStrToInt(const std::string& str);

编辑 关于这个特定示例,C++标准库已经提供了此功能,因此您无需重新实现它。

namespace

解决这个问题的常用方法。

无论如何,类中的函数都应该声明static,并且拥有一个类以便您可以将函数组合在一起并不是好的做法。

都不是。选择函数对象(有时称为 Functor)。

struct str_to_int {
  int operator()(const std::string& s) const { return 23; }
};

为什么?这使您能够在需要时添加状态。它有效拥有所有标准算法设施和各种现代C++图书馆。您可以使其成为模板函数,而无需您的用户注意到它。

现在,您可以执行以下操作:

std::vector<std::string> strings;
std::vector<int> integers;
std::transform(begin(strings), end(strings), 
               std::back_inserter(integers), str_to_int());

或者有一天把你的定义变成:

struct str_to_int {
  int operator()(const std::string& s) const { return 23; }
  // ha
  int operator()(const std::wstring& s) const { return 42; }
  // haha!
  int operator()(const char* x) const { return 42; }
};

上面的代码将继续工作而不会出现问题。免费函数的情况并非如此。

随机评论:为什么要传递指向string的指针类似的东西?

我通常只使用一个函数。 把它放到一个类中只是噪音(或伪 OO,因为该类没有任何实际行为它自己的)。

有一个例外:STL 的功能模板参数是如果您使用带有operator()()的类,通常效率更高,而不是函数。 (如果使用功能对象,则实际被调用的函数是一个编译时常量,可以很容易地内联。 如果使用函数,则模板参数的类型为函数,而不是函数本身,并且内联的可能性较小。但是,即使在这种情况下,我也会从函数开始,并添加功能对象类型(如果需要)。