递归函数指针。 Stroustrup的例子

时间:2014-04-08 22:24:34

标签: c++

目前我正在阅读Stroustrup Programming:Principles and Practice C ++。我面对这个例子:

typedef void (*Pfct0)(struct Shape2*);
typedef void (*Pfct1int)(struct Shape2*,int);

struct Shape2{
    Pfct0 draw;
    Pfct1int rotate;
};

void draw(struct Shape2* p)
{
    (p->draw)(p);
}

void rotate(struct Shape2* p,int d)
{
    (p->rotate)(p,d);
}

int f(struct Shape2* pp)
{
    draw(pp);
    return 0;
}

我无法获得绘制和旋转实际执行的功能。 我知道什么是typedef,函数指针, - >运营商。 据我了解p-> draw函数将递归调用自身。我对吗? 制作绘画或旋转等功能的实际用途是什么?

3 个答案:

答案 0 :(得分:2)

在我看来,Stroustrup正在纯C中实现类似对象的调度。每个Shape2对象都有自己的draw和rotate方法。给定一个任意的Shape2 p,draw(p)查找p的draw方法,并将其应用于自身(可能p会有一些其他内容,draw会读取并采取操作。)除非特定,否则该函数不会递归调用自身。用于p调用的绘制函数以递归方式绘制。如果Shape2是基类的话,这非常类似于p.draw()在C ++中的作用。

答案 1 :(得分:1)

函数drawrotate调用结构p成员指向的函数,并在指向此结构p的指针上调用这些函数。

也许这会有所帮助:

typedef void (*pointer_to_function)(struct Shape2*);

struct Shape2{
    pointer_to_function draw;
    Pfct1int rotate;
};

void function(struct Shape2* p)
{
    (p->draw)(p);
    ^^^^^^^^^
    // this is pointer_to_function so call the function pointed to by it 
    // with some argument of type struct Shape2*, in example p itself, why not
}

这个片段中的误导性是我们不知道对象Shape2中的指针是如何初始化的,但必须初始化它们以指向具有适当签名的某些函数,然后才将它们传递给全局drawrotate

答案 2 :(得分:1)

Shape2的每个实例都可以拥有自己的绘制和旋转功能。

如果s是指向Shape的指针,

draw(s);

相同
(s->draw)(s);

这可用于实现类似

的内容
drawrect(Shape* s);
drawcircle(Shape* s);
...
Shape shapes[2];
shapes[0].draw = &drawrect;
shapes[1].draw = &drawcircle;
...
for(int i = 0; i < 2; i++) {
    draw(&shapes[i]);
}