使用Functor改变案例

时间:2016-10-12 00:44:41

标签: c++ operator-overloading functor

我对探子没有经验,并试图在某种程度上理解基础知识。我想要的只是一个函子,它将获取一个字符串并返回相同的字符串,并将所有值更改为大写。我有以下代码:

#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;
}

这显然导致屏幕上没有任何内容,但我希望有人可以帮助解释我必须做些什么才能在此获得所需的结果,这样我就能更好地理解这个系统是如何工作的。

提前感谢您的帮助!

3 个答案:

答案 0 :(得分:3)

对于初学者来说,仿函数是实现operator()的对象。它不是一个构造函数采用参数的对象(虽然特殊用途的仿函数可以,但这不是这种情况)。所以第一个错误是你的仿函数有一个构造函数:

myFunctor(string) {};

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

myFunctor() {}

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

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

myFunctor convert;

然后,调用仿函数:

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

答案 1 :(得分:0)

这是“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;
}

答案 2 :(得分:0)

如果我错了,请原谅我,看看你的代码购买我认为你对c ++不是很有经验。我强烈建议你re一些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;
}