C++ 使用函子更改大小写

C++ 使用函子更改大小写,c++,operator-overloading,functor,C++,Operator Overloading,Functor,我对函子缺乏经验,并且试图了解一些基本知识。我想要的是一个函子,它将接受一个字符串并返回相同的字符串,所有值都更改为大写。我有以下代码: #include "stdafx.h" #include <iostream> #include <string> #include <string.h> #include <algorithm> using namespace std; class myFunctor { private: public:

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

#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;
}
#包括“stdafx.h”
#包括
#包括
#包括
#包括
使用名称空间std;
类myFunctor{
私人:
公众:
myFunctor(字符串){};
字符串运算符()(字符串);
};
字符串myFunctor::运算符()(字符串stringToConvert){
转换(stringToConvert.begin()、stringToConvert.end()、stringToConvert.begin()、toupper);
返回字符串转换;
}
int main(){
myFunctor convert(“我希望转换此字符串”);
返回0;
}
这显然不会导致任何东西被打印到屏幕上,但我希望有人能帮助解释我必须进一步做些什么才能得到想要的结果,这样我才能更好地理解这个系统是如何工作的


提前谢谢你的帮助

首先,函子是实现
操作符()
的对象。它不是一个构造函数接受参数的对象(虽然特殊用途的函子可以,但这里不是这种情况)。第一个错误是你的函子有一个构造函数:

myFunctor(string) {};
而且,这个构造函数对它的参数没有任何作用。这应该是第一条线索,在你的例子中,你的函子的构造函数应该不带参数,应该是:

myFunctor() {}
或者,完全忘记构造函数,让函子类使用其默认构造函数

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

myFunctor convert;
然后,调用函子:

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

std::cout这是“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;
}
#包括
#包括
#包括
使用名称空间std;
类myFunctor{
公众:
myFunctor(){};
字符串运算符()(字符串);
};
字符串myFunctor::运算符()(字符串stringToConvert){
//STD变换函数
转换(stringToConvert.begin(),stringToConvert.end(),stringToConvert.begin(),[](无符号字符c){return toupper(c);});
返回字符串转换;
}
int main(){
myFunctor myfun;//您不应该有参数构造函数
string converted_string=myfun(“我想转换这个字符串”);//实际函数对象调用

如果我错了,请原谅我,通过看你的代码,我想你对C++的经验不是很丰富。我强烈推荐你做一些Reed,因为你犯了几个基本错误,可以很容易地用一些阅读来修正。 因此,首先,在c++中创建函数不需要创建对象:

int function_name(int foo){
    //do something
};
如果要使用某个对象,您会犯几个错误: 首先,您需要在类型后面包含一个标识符:

myFunctor(string string_id) {};
第二,它是一个类构造函数,让它接收一个输入,然后对其不做任何操作是没有意义的。您要么不创建构造函数,使用默认值,要么将值存储起来供以后使用:

string create_input;

myFunctor(string string_id) { create_input = string_id};
第二,你要做的是一名操作员,这是一些高级的东西,当你的工作经验稍微丰富一点时,你应该留下来

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

你会用像:

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

您没有调用
操作符()
,也没有打印任何内容。
int main() {
    myFunctor convert();
    convertor.function_name("i want this string converted");
    return 0;
}