Opaque pointer
From Wikipedia, the free encyclopedia
In computer programming, an opaque pointer is a datatype that hides its internal implementation using a pointer. This allows the implementation of the whole interface to change without the need to recompile the modules using it. This is important for providing binary compatibility through different versions of a shared library, for example.
This technique is sometimes referred as "handle classes", the "Pimpl idiom" (for "private implementation idiom") or "Cheshire Cat", especially among the C++ community (Eckel 2000).
Contents |
[edit] Examples
[edit] Ada
Opaque pointers are present in programming languages like Ada, C/C++ or Modula-2. For example, the following Ada code sample declares an opaque pointer:
package Library_Interface is type Handle is limited private; -- Operations... private type Hidden_Implementation; -- Defined in the package body type Handle is access Hidden_Implementation; end Library_Interface;
The type Handle
is an opaque pointer to the real implementation, that is not defined in the specification. Note that the type is not only private (to forbid the clients from accessing the type directly, and only through the operations), but also limited (to avoid the copy of the data structure, and thus preventing dangling references).
package body Library_Interface is type Hidden_Implementation is record ... -- The actual implementation can be anything end record; -- Definition of the operations... end Library_Interface;
These types are sometimes called "Taft types" —named after Tucker Taft, the main designer of Ada 95— because were introduced in the so-called Taft Amendment to Ada 83.
[edit] C++
class Handle { private: struct CheshireCat; // Not defined here CheshireCat *smile; // Handle public: Handle(); // Constructor ~Handle(); // Destructor // Other operations... };
#include "handle.hpp" struct Handle::CheshireCat { ... // The actual implementation can be anything }; Handle::Handle() { smile = new CheshireCat; } Handle::~Handle() { delete smile; }
One type of opaque pointer commonly used in C++ class declarations is the d-pointer. The d-pointer is the only private data member of the class and points to an instance of a struct defined in the class's implementation file. Developed by Arnt Gulbrandsen of Trolltech, this method allows class declarations to omit private data members, except for the d-pointer itself. The result is that more of the class's implementation is hidden from view, that adding new data members to the private struct does not affect binary compatibility, and that the header file containing the class declaration only has to #include those other files that are needed for the class interface, rather than for its implementation. As a side benefit, compiles are faster because the header file changes less often. The d-pointer is heavily used in the Qt and KDE libraries.
[edit] See also
[edit] References
- Bruce Eckel (2000). "Chapter 5: Hiding the Implementation", Thinking in C++, Volume 1: Introduction to Standard C++, 2nd Edition, Prentice Hall. ISBN 0-13-979809-9.