1

我想在我的程序中编写一个可以将字符串转换为 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} 
    }

对不起,如果这个问题听起来有点傻,但我和另外两个人在一个团队中,我们对此的看法非常不同。1 说类适用于所有事物并为所有事物创建类,我认为对于这样一个简单的问题,一个简单的函数是一个很好的解决方案。

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

谢谢大家!

4

5 回答 5

5

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

于 2012-08-08T08:04:25.673 回答
2

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

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

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

关于这个特定示例的编辑,C++ 标准库已经提供了这个功能,所以你不需要重新实现它。

于 2012-08-08T08:03:36.200 回答
1

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

无论如何都应该声明类中的函数static,并且拥有一个类只是为了将函数组合在一起并不是一个好习惯。

于 2012-08-08T08:03:10.950 回答
0

两者都不。寻找一个函数对象(有时称为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; }
};

并且上面的代码将继续正常工作。免费功能不会出现这种情况。

随机评论:你为什么要传递一个指向 a 的指针string呢?

于 2012-08-08T08:03:56.780 回答
0

我通常只会使用一个函数。将它放入一个类只是噪音(或伪 OO,因为该类本身没有任何实际行为)。

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

于 2012-08-08T09:13:35.670 回答