![]() | |
![]() ![]() |
![]() | Imperfect C++ Practical Solutions for Real-Life Programming By Matthew Wilson |
Table of Contents | |
Appendix B. "Watch That Hubris!" |
B.3. Paranoid ProgrammingOne of the constant paranoias in software engineering is the protection of intellectual property, and I've fallen under this particular spell in the past. Here's a little slice of horror. The Win32 GUI programmers among you will be well aware of the features and shortcomings of the List-View common control. My first stab at enhancing them was done via MFC, multiple inheritance, and some truly evil tricks. The extended features—colored subitem text and background; per subitem user-data and images; 2D walking edit fields; and so on—were provided by the mixin class CColouredList.[2]
class DLL_CLASS CColouredListView : public CListView , public CColouredList { . . . class DLL_CLASS CColouredListCtrl : public CWnd , public CColouredList { . . . Without having any idea as to whether this component would even be desirable to any potential clients, I nonetheless spent great effort in hiding the implementation of the ever-so-smart control enhancements, by virtue of a delightful artifice: class _CLCInfoBlock; // Forward declaration #define _CLC_RESBLK (208) class DLL_CLASS CColouredList : public COwnerDrawCtrl { . . . // Many, many methods // Members protected: HWND &m_hWnd; // HWND reference. _CLCInfoBlock &m_block; // Info block. private: BYTE m_at[_CLC_RESBLK]; // reserved. }; I'm sure you've guessed the rest: the class _CLCInfoBlock is defined within the implementation file of the CColouredList class. In the constructor of CColouredList, an instance of _CLCInfoBlock is placement constructed into the m_at storage: CColouredList::CColouredList(HWND &hWnd) : m_hWnd(hWnd) , m_block(*new(m_at) _CLCInfoBlock) {} Never mind the fact that an array of bytes is not guaranteed to have correct alignment for the in-place construction of a user-defined type, why on earth 208? The whole thing's just so awful. This amounts to malpractice in any reasonable estimation, and I can't conceive of anyone purchasing anything that looks like CColouredList. ![]() |
![]() | |
![]() ![]() |