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

Wikibooks
Wikibooks Ada Programming has a page on the topic of

[edit] References

[edit] External links