附录E GUI实现

当你最终理解了你在做什么时,事情就会向正确方向发展了。

——Bill Fairbank

本附录介绍回调函数、Window、Widget和Vector_ref的实现细节。在第21章中,由于还没有介绍指针和类型转换的相关知识,我们无法给出GUI实现的完整描述,因此将这部分内容放到本附录中。

E.1 回调函数实现

回调函数可实现如下:

如果你已经理解了第12章,很显然Address必须是void*。而且,当然,reference_to<Simple_window>(addr)必须是由名为addr的void*创建的Simple_window的引用。但是,除非你以前有相关的程序设计经验,否则在阅读第12章之前,你不会有“很显然”或者“当然”的感觉。因此,让我们好好看一下地址使用的细节。

如附录A.17所述,C++提供了类型命名的功能。例如:

这意味着现在就可以用名字Address来代替void*了。在此,我们用Address这个名字来强调传递了一个地址,并掩盖这样一个事实:void*是指向未知类型的对象的指针。

因此,cb_next()接受一个名为addr的void*参数,并立即用某种方法将其转换为Simple_window&:

reference_to是一个模板函数(见附录A.13): ...

Get C++程序设计:原理与实践(进阶篇)(原书第2版) now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.