拼图+功能指针

时间:2013-09-11 18:09:23

标签: c++ function function-pointers

当设置两个参数时,我需要调用一个函数“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()'

你能发现什么吗?

3 个答案:

答案 0 :(得分: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( );

答案 1 :(得分:0)

函数不是C ++中的关键字,而且函数指针声明错误,应该是

void general_function(bool (*choice)(string, char*)) {
   /**/
}

答案 2 :(得分: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
}