![]() |
CTK
0.1.0
The Common Toolkit is a community effort to provide support code for medical image analysis, surgical navigation, and related projects.
|
Utility macros for handling private implementations. It is in addition to QtGlobal: Q_DECLARE_PRIVATE, Q_DECLARE_PUBLIC, Q_D and Q_Q.
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.
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.
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 Q_DECLARE_PRIVATE macro in the private section of the public class.
Additionally, you must construct the d_ptr pointer in the constructor of the public 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, nothing special needs to be done, except if you want the private class to have access to the public class. Then use Q_DECLARE_PUBLIC and create a public class pointer member. The constructor of the private class should take a public class reference as a parameter.
Use the Q_D() macros 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 Q_Q() macro.
Header file (ctkFooObject.h):
Implementation file (ctkFooObject.cpp):