如何在C ++中修复函数指针

时间:2010-04-07 00:13:08

标签: c++ function-pointers

首先,我对函数指针及其可怕的语法都很陌生,所以玩得很好。

我正在编写一种方法来根据我传入的函数过滤位图中的所有像素。我编写了取消引用它的方法并在像素缓冲区中调用它但我在位图类中也需要一个包装器方法接受函数指针并传递它。我该怎么做?语法是什么?我有点难过。

这是我的代码,其中删除了所有不相关的位并组合了文件(读取所有已初始化的变量等)。

struct sColour
{
    unsigned char r, g, b, a;
};

class cPixelBuffer
{
private:
    sColour* _pixels;
    int _width;
    int _height;
    int _buffersize;
public:
    void FilterAll(sColour (*FilterFunc)(sColour));
};


void cPixelBuffer::FilterAll(sColour (*FilterFunc)(sColour))
{
    // fast fast fast hacky FAST
    for (int i = 0; i < _buffersize; i++)
    {
        _pixels[i] = (*FilterFunc)(_pixels[i]);
    }
}

class cBitmap
{
private:
    cPixelBuffer* _pixels;
public:
    inline void cBitmap::Filter(sColour (*FilterFunc)(sColour))
    {
           //HERE!!
    }
};

3 个答案:

答案 0 :(得分:4)

如果我理解你想要的东西:

inline void cBitmap::Filter(sColour (*FilterFunc)(sColour))
{
       _pixels->FilterAll( FilterFunc);
}

如果你对函数指针类型使用typedef,那么处理函数指针通常会更容易阅读(你自己实际上并不是太糟糕 - 它们可以非常容易地变得更糟):

struct sColour
{
    unsigned char r, g, b, a;
};

typedef 
sColour (*FilterFunc_t)(sColour);   // typedef for a FilterFunc

class cPixelBuffer
{
private:
    sColour* _pixels;
    int _width;
    int _height;
    int _buffersize;
public:
    void FilterAll(FilterFunc_t FilterFunc);
};


void cPixelBuffer::FilterAll(FilterFunc_t FilterFunc)
{
    // fast fast fast hacky FAST
    for (int i = 0; i < _buffersize; i++)
    {
        _pixels[i] = (*FilterFunc)(_pixels[i]);
    }
}

class cBitmap
{
private:
    cPixelBuffer* _pixels;
public:
    inline void cBitmap::Filter(FilterFunc_t FilterFunc)
    {
           _pixels->FilterAll( FilterFunc);
    }
};

答案 1 :(得分:3)

Boost库可以让您的生活更轻松。见boost function
例如,这是一个函数,它接受一个回调函数,该函数需要两个int并返回一个int

void do_something( boost::function<int (int, int)> callback_fn );

然后它可以像普通函数一样使用:

int result = callback_fn(1,2);

将它传递给do_something,如下所示:

boost::function<int (int, int)> myfn = &the_actual_fn;
do_something(myfn);

使用boost函数,您还可以轻松传递类成员函数(请参阅boost bind) 祝你的计划好运。

答案 2 :(得分:2)

使用typedef作为函数指针类型可以使事情更清晰:

typedef sColour (*FilterFunc_t)(sColour)
void FilterAll(FilterFunc_t FilterFunc);

将包含函数指针的变量传递给另一个函数与传递任何其他变量的工作方式相同:

inline void cBitmap::Filter(FilterFunc_t FilterFunc) {
   FilterAll(FilterFunc);
}