2016-10-12 4 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

처음에는 functor가 operator()을 구현하는 개체입니다. 생성자가 매개 변수를받는 객체는 아닙니다 (특수 목적의 펑터도 가능하지만, 여기서는 그렇지 않습니다). 그래서 첫번째 실수는 당신의 펑터가 생성자를 가지고 있다는 것입니다 :

myFunctor(string) {}; 

그리고이 생성자는 매개 변수를 가지고 아무것도하지 않습니다.

myFunctor() {} 

을 또는 완전히 생성자를 잊지하고, 펑 클래스는 기본 생성자를 사용하자 : 그래서 귀하의 경우에, 당신의 펑의 생성자는 매개 변수를 취하지해야하고, 간단하게해야한다, 그 첫 번째 단서해야합니다. "샘 Varshavchik"에서 좋은 설명입니다

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

:
myFunctor convert; 

그리고 그 후

이는 펑터를 호출 :

이제 기본 생성자와, 그것을 구성하는 시간이다

다음은 이해를 돕기 위해 수정 한 코드입니다. 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++에 익숙하지 않은 것으로 보입니다. 나는 약간의 독서로 쉽게 고칠 수있는 몇 가지 기본적인 실수를하기 때문에 당신이 어떤 것을 tutorials을 리드 할 것을 강하게 권합니다. 당신이 몇 가지 실수를하는 객체를 사용하려면

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

:

는 C++에서 함수를 만들 개체를 만들 필요가 없습니다 모든 그래서 일단 먼저 당신은을 포함해야 유형 후 식별자 : 클래스 생성자이며, 그것은 입력을받을 후 그것으로 아무것도하지 않고 가지고 더 SENS하지 않습니다

myFunctor(string string_id) {}; 

두 번째 그것.당신은 하나 생성자을하지 않으며 기본값을 사용하거나 나중에 사용하기 위해 저장된 값을 가지고 무엇을 당신이하려고하는 것은 overloading 연산자입니다

string create_input; 

myFunctor(string string_id) { create_input = string_id}; 

둘째, 그것은 당신을 위해 남겨 두어야 일부 고급 물건입니다 때 조금 더 많은 경험.

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

및 요 같이 사용합니다 :

과 같이 당신이 정상적인 기능을 선언 할 수 있습니다 반면에

은 (는 연산자를 오버로드 할 수있는 키워드를 사용하기 때문에 이름 operator이 유효하지 않습니다)

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