目前我正在阅读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函数将递归调用自身。我对吗? 制作绘画或旋转等功能的实际用途是什么?
答案 0 :(得分:2)
在我看来,Stroustrup正在纯C中实现类似对象的调度。每个Shape2对象都有自己的draw和rotate方法。给定一个任意的Shape2 p,draw(p)查找p的draw方法,并将其应用于自身(可能p会有一些其他内容,draw会读取并采取操作。)除非特定,否则该函数不会递归调用自身。用于p调用的绘制函数以递归方式绘制。如果Shape2是基类的话,这非常类似于p.draw()在C ++中的作用。
答案 1 :(得分:1)
函数draw
和rotate
调用结构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中的指针是如何初始化的,但必须初始化它们以指向具有适当签名的某些函数,然后才将它们传递给全局draw
和rotate
。
答案 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]);
}