-5

2 つのパラメーターが設定されている場合、関数「general_function()」を呼び出す必要があります。お気に入り:

.cpp ファイル

if (var_a == 1) {
  general_function();
}

if (var_b == 1) {
  generam_function();
}

general_function の定義は次のとおりです。

function general_function() {
  // Some 40 lines
  // Some 20 lines .. *
  // Some 40 lines
}

現在、両方の呼び出しで、* でマークした 20 行が異なっています。したがって、var_a が設定されると、20 行のセットが実行され、var_b が設定されると、別の 20 行のセットが実行されます。

この状況を克服する方法はたくさんあります。関数を作成し、パラメータを渡します。しかし、OOP の世界から何かをしたかったのです。そのため、そこで関数ポインターを作成しました。だから、これは私がやったことです:

.h ファイル

bool function is_a_set(string str, char* name) {
  // Do something
}

bool function is_b_set(string str, char* name) {
  // Do something
}

.cpp ファイル

if (var_a == 1) {
  general_function(is_a_set);
}

if (var_b == 1) {
  general_function(is_b_set);
}

general_function の定義は次のとおりです。

function general_function(bool (*choice)(string, char*)) {
  // Some 40 lines
  choice(string, char*);
  // Some 40 lines
}

私はそれが今まで明らかであることを願っています。しかし、「エラー:general_function()の呼び出しに一致する関数がありません」が表示されます

あなたは何かを見つけることができますか?

4

3 に答える 3

1

関数ポインターの複雑さを回避し、より OOP のような方法でこれに取り組むために、継承と仮想関数の使用を検討してください。

class BaseThing
{
public:
    bool generalFunction( )
    {
        // some 40 lines of code

        specialMethod( );

        // some other 40 lines of code
    }

    virtual void specialMethod( ) = 0;
};

class AThing : public BaseThing
{
public:
    virtual void specialMethod( )
    {
        // special code for A
    }
};

class BThing : public BaseThing
{
public:
    virtual void specialMethod( )
    {
        // special code for B
    }
};

次に、特定の状況に必要なオブジェクトを使用します。

BaseThing* thing = new AThing( );

thing->generalFunction( );

delete thing;

thing = new BThing( );

thing->generalFunction( );
于 2013-09-11T18:26:17.540 に答える
0

これが私ができることです。ヘッダーや関数ポインターをしばらく扱っていないことを理解してください。

クラスで:

private int var_a;
private int var_b;

そして、一般的な方法では:

void general_function()
{
    //40 lines that run no matter which variable is set
    if ( var_a == 1 )
    {
        //20 lines that run if var_a is set
        //or better yet, call a submethod
    }
    //if var_a and var_b are mutually exclusive, use else if
    if ( var_b == 1 )
    {
        //20 lines that run if var_b is set
        //or better yet, call a submethod
    }
    //40 more lines that run no matter which variable is set
}
于 2013-09-11T18:21:46.243 に答える