2016-10-12 8 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 + +で経験していないと思います。私は強くいくつかの読書で簡単に修正することができますいくつかの基本的な間違いを作るのでtutorialsをリードすることをお勧めします。あなたは、いくつかのミスを作っているオブジェクトを使用したい場合

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

は、あなたがC++で関数を作成するオブジェクトを作成する必要はありませんすべてのだから、最初の 最初にあなたがインクルードする必要があり

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; 
} 
関連する問題