3

関数をパラメーターとして取り、その関数をプライベート リストに適用するクラス関数をメイン プログラムで呼び出そうとしています。エラーが発生していますinvalid conversion from char to char (*f)(char)。うまくいけば、関数をパラメーターとして渡す方法がわかりません。以下は私のメインcppファイルの関数です

char ToUpper(char c)
{
char b='A';
for(char a='a';a<='z';a++)
{
   if(a==c)
  {
     c=b;
     break;
  }
  ++b;
}
return c;
}

void upperList(LineEditor line)
{
char c;
for(int i=0;i<100;i++)   //ensure iterator is at beginning of line
  line.left();           

for(int i=0;i<100;i++)
{
  c=line.at();               //assign character current element pointed to by iterator
  line.apply(ToUpper(c));    //problem: trying to apply ToUpper function to char c
  line.right();              //apply function and increment iterator
}
}

そして、これは適用メンバー関数です

void LineEditor::apply(char (*f)(char c))
{
*it=f(c);
}

また、明らかでない場合のために、cctypes の toupper と tolower を使用してみましたが、これらは整数を受け取って返します。

4

4 に答える 4

2

を呼び出すとToUpper、関数は返されず、(想定される) 文字が大文字の形式で返されます。

これが機能しないもう 1 つの理由は、関数ポインターのシグネチャ内で引数を作成できないためです。パラメーターの領域は、関数が取る型のみを指定します。これ...

char (*f)(char c);
//        ^^^^^^

したがって、間違っています。

解決:

astd::functionstd::bindit を引数に使用します。

#include <functional>

line.apply(std::bind(ToUpper, c));

の署名を次のapplyように変更する必要があります。

void LineEditor::apply(std::function<char (char)> f);

これができない場合はapply、2 番目のパラメーターを引数として取ります。

void LineEditor::apply(char (*f)(char), char c);

として呼び出しますapply(ToUpper, c)

于 2013-11-03T23:25:38.363 に答える
0

ToUpper(c)は関数を呼び出しますが、呼び出すときにapplyその関数をすぐに呼び出したくないので、関数自体にアクセスする方法であるため、apply(ToUpper)sayを実行する必要があります。ToUpper

于 2013-11-03T23:25:52.790 に答える
0

式 ToUpper(c) の型は char です。だから電話する

line.apply(ToUpper(c));

関数 apply を char 型の引数で呼び出すことを意味します。

関数を次のように定義する必要があります

void LineEditor::apply( char c, char f(char) )
{
*it=f(c);
}
于 2013-11-03T23:29:47.767 に答える
0

車輪を再発明する必要はありません。 ::toupper::tolowertake と returnintですが、それらの有効範囲は ですunsigned char。さらに、std::toupper両方std::tolowerがかかりcharます。

を使用していないように見えるのでstd::string、できるだけコードに近づけるようにします。

void upperList(LineEditor line)
{
    char c;
    // you do not have a begin() function??
    for(int i=0;i<100;i++)   //ensure iterator is at beginning of line
        line.left();           

    for(int i=0;i<100;i++)
    {
        c=line.at();
        c = std::toupper(c);
        line.at() = c; // assuming this returns a reference
        line.right(); 
    }
}

文字列クラスをクラスのように動作するように変更すると、はるかに簡単になりますstd::string

std::string line;
std::transform(line.begin(), line.end(), line.begin(), std::ptr_fun<int, int>(std::toupper));

于 2013-11-03T23:50:27.810 に答える