Related Functions

ctkPimpl Class Reference

Hide private details of a class. More...

List of all members.

Related Functions

(Note that these are not member functions.)



 CTK_CONSTRUCTOR_1_ARG_CXX(PUB, _ARG1)
 CTK_CONSTRUCTOR_NO_ARG_CXX(PUB)
 CTK_D(PUB)
 CTK_DECLARE_PRIVATE(PUB)
 CTK_DECLARE_PUBLIC(PUB)
 CTK_GET_CXX(PUB, _TYPE, _NAME, _VARNAME)
 CTK_INIT_PRIVATE(PUB)
 CTK_P(PUB)
 CTK_SET_CXX(PUB, _TYPE, _NAME, _VARNAME)

Detailed Description

Hide private details of a class.

Application code generally doesn't have to be concerned about hiding its implementation details, but when writing library code it is important to maintain a constant interface, both source and binary. Maintaining a constant source interface is easy enough, but keeping the binary interface constant means moving implementation details into a private class. The PIMPL, or d-pointer, idiom is a common method of implementing this separation. ctkPimpl offers a convenient way to connect the public and private sides of your class.

Getting Started

Before you declare the public class, you need to make a forward declaration of the private class. The private class must have the same name as the public class, followed by the word Private.

The Public Class

Generally, you shouldn't keep any data members in the public class without a good reason. Functions that are part of the public interface should be declared in the public class, and functions that need to be available to subclasses (for calling or overriding) should be in the protected section of the public class. To connect the private class to the public class, include the QCTK_DECLARE_PRIVATE macro in the private section of the public class. In the example above, the private class is connected as follows:

Additionally, you must include the QCTK_INIT_PRIVATE macro in the public class's constructor.

The Private Class

As mentioned above, data members should usually be kept in the private class. This allows the memory layout of the private class to change without breaking binary compatibility for the public class. Functions that exist only as implementation details, or functions that need access to private data members, should be implemented here.

To define the private class, inherit from the template qCTKPrivate class, and include the QCTK_DECLARE_PUBLIC macro in its public section. The template parameter should be the name of the public class.

Accessing Private Members

Use the qctk_d() function (actually a function-like object) from functions in the public class to access the private class. Similarly, functions in the private class can invoke functions in the public class by using the qctk_p() function (this one's actually a function).


Friends And Related Function Documentation

CTK_CONSTRUCTOR_1_ARG_CXX (   PUB,
  _ARG1 
) [related]

Define a public class constructor with one argument

Also make sure the Pimpl is initalized

Definition at line 70 of file ctkPimpl.h.

CTK_CONSTRUCTOR_NO_ARG_CXX (   PUB  )  [related]

Define a public class constructor with no argument

Also make sure the Pimpl is initalized

Definition at line 59 of file ctkPimpl.h.

CTK_D (   PUB  )  [related]

Returns a pointer (or reference) in the current scope named "d" to the private class.

This function is only available in a class using QCTK_DECLARE_PRIVATE.

Definition at line 131 of file ctkPimpl.h.

CTK_DECLARE_PRIVATE (   PUB  )  [related]

Declares that a public class has a related private class.

This should be put in the private section of the public class. The parameter is the name of the public class. For convenience, this macro also add 'typedef PUB Self;'

Definition at line 109 of file ctkPimpl.h.

CTK_DECLARE_PUBLIC (   PUB  )  [related]

Declares that a private class has a related public class.

This may be put anywhere in the declaration of the private class. The parameter is the name of the public class.

Definition at line 118 of file ctkPimpl.h.

CTK_GET_CXX (   PUB,
  _TYPE,
  _NAME,
  _VARNAME 
) [related]

Define the setter in the public class.

This should be put in the .cxx file of the public class. The parameter are the name of the public class (PUB), the type of the argument to return (_TYPE), the name of the setter(_NAME) and the name of the variable in the Private class(_VARNAME).

Definition at line 97 of file ctkPimpl.h.

CTK_INIT_PRIVATE (   PUB  )  [related]

Initializes resources owned by the private class.

This should be called from the public class's constructor, before qctk_d() is used for the first time. The parameter is the name of the public class.

Definition at line 125 of file ctkPimpl.h.

CTK_P (   PUB  )  [related]

Creates a pointer ( or reference) in the current scope named "q" to the public class.

This macro only works in a class using CTK_DECLARE_PUBLIC.

Definition at line 138 of file ctkPimpl.h.

CTK_SET_CXX (   PUB,
  _TYPE,
  _NAME,
  _VARNAME 
) [related]

Define the setter in the public class.

This should be put in the .cxx file of the public class. The parameter are the name of the public class (PUB), the type of the argument to return (_TYPE), the name of the getter(_NAME) and the name of the variable in the Private class(_VARNAME).

Definition at line 84 of file ctkPimpl.h.


The documentation for this class was generated from the following file:
 All Classes Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Defines