【问题标题】:Using A Functor To Change Case使用函子改变大小写
【发布时间】:2016-10-12 00:44:40
【问题描述】:

我对函子缺乏经验,并试图了解一些基础知识。我想要的只是一个函子,它将接受一个字符串并返回相同的字符串,并将所有值都更改为大写。我有以下代码:

#include "stdafx.h"
#include <iostream>
#include <string>
#include <string.h>
#include <algorithm>

using namespace std;

class myFunctor {
private:
public:
    myFunctor(string) {};
    string operator() (string);
};

string myFunctor::operator() (string stringToConvert) {
    transform(stringToConvert.begin(), stringToConvert.end(), stringToConvert.begin(), toupper);
    return stringToConvert;
}

int main() {
    myFunctor convert("i want this string converted");
    return 0;
}

这显然不会在屏幕上打印任何内容,但我希望有人可以帮助解释我必须进一步做什么才能在此处获得所需的结果,以便我更好地了解该系统的工作原理。

提前感谢您的帮助!

【问题讨论】:

  • 你没有打电话给operator(),而且根本没有打印任何东西。

标签: c++ operator-overloading functor


【解决方案1】:

对于初学者来说,仿函数是一个实现operator() 的对象。它不是构造函数带有参数的对象(尽管专用函子可以,但这里不是这种情况)。所以第一个错误是你的仿函数有一个构造函数:

myFunctor(string) {};

而且,这个构造函数并没有对它的参数做任何事情。所以这应该是第一个线索,在你的情况下,你的仿函数的构造函数应该不带参数,应该是:

myFunctor() {}

或者,完全忘记构造函数,让仿函数类使用其默认构造函数。

现在,使用它的默认构造函数,是时候构造它了:

myFunctor convert;

然后,调用仿函数:

std::cout << convert("i want this string converted") << std::endl;

【讨论】:

    【解决方案2】:

    这是“Sam Varshavchik”的一个很好的解释

    这是您修改后的代码,供您理解:我注意到您没有正确使用 std::transform也不要混合使用“C”字符串和“STD”字符串。很难处理。 所以删除了你的标题“string.h”

    我重新访问了您的代码,下面是工作版本。

    #include <iostream>
    #include <string>
    #include <algorithm>
    
    using namespace std;
    
    class myFunctor {
    
        public:
            myFunctor() {};
            string operator() (string);
    };
    
    string myFunctor::operator() (string stringToConvert) {
    
         //STD transform function
         transform(stringToConvert.begin(), stringToConvert.end(), stringToConvert.begin(),[](unsigned char c) { return toupper(c); });
         return stringToConvert;
    }
    
    int main() {
    
        myFunctor myfun; //You should have no argument constructor
        string converted_string = myfun("i want this string converted");//Acttual function object invocation
    
        cout<<converted_string<<endl;
        return 0;
    }
    

    【讨论】:

      【解决方案3】:

      如果我错了,请原谅我,看你的代码购买我想你对 c++ 不是很有经验。我强烈建议您阅读一些tutorials,因为您犯了几个基本错误,可以通过阅读轻松解决。

      所以首先你不需要创建一个对象来在c++中创建一个函数:

      int function_name(int foo){
          //do something
      };
      

      如果你想使用一个对象,你会犯几个错误: 首先你需要在类型后面加上一个标识符:

      myFunctor(string string_id) {};
      

      第二个是类构造函数,让它接收输入然后什么都不做是没有意义的。您要么不创建构造函数并使用默认值,要么将值存储起来供以后使用:

      string create_input;
      
      myFunctor(string string_id) { create_input = string_id};
      

      您要做的第二件事是overloading 一个操作员,这是一些高级的东西,当您更有经验时应该留下。

      另一方面,您可以声明一个普通函数,(名称 operator 无效,因为它是用于重载运算符的关键字),如下所示:

      string myFunctor::function_name() (string stringToConvert) {
          transform(stringToConvert.begin(), stringToConvert.end(), stringToConvert.begin(), toupper);
          return stringToConvert;
      }
      

      你会用这样的:

      int main() {
          myFunctor convert();
          convertor.function_name("i want this string converted");
          return 0;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-10
        • 2017-12-01
        • 1970-01-01
        • 2015-08-15
        • 2016-08-11
        相关资源
        最近更新 更多