2016-10-12 27 views
1

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

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

这显然会导致没有被显示在屏幕上,但我希望有人能帮忙解释一下我必须做进一步的在这里得到期望的结果,所以我可以更好地了解如何系统工作。

感谢您的帮助!

+0

你没有调用'operator()',并打印出任何东西。 – songyuanyao

回答

3

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

myFunctor(string) {}; 

而且,这个构造函数不会对它的参数做任何事情。所以这应该是第一条线索是,在你的情况,你的仿函数的构造不应采取任何参数,并且应该仅仅是:

myFunctor() {} 

或者,完全忘记构造,并让函数子类使用它的默认构造函数。现在

,其默认的构造函数,它的时间来构建它:

myFunctor convert; 

而在此之后,调用函子:

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

,从“萨姆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; 
} 
0

请原谅我,如果我错了,通过看你的代码来购买我想你对C++没什么经验。我强烈建议你re一些tutorials,因为你犯了几个基本的错误,可以很容易地解决一些阅读。

所以,首先你不必创建一个对象来创建C++函数:

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

如果你想使用一个对象,你正在做的几个误区: 首先,你需要包括类型标识符后:

myFunctor(string string_id) {}; 

其次,它是一个类的构造函数,它使没有SENS把它接收输入,然后做与它无关。你要么不作任何构造和使用默认的或者有储存供日后使用的值:

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