Suppose you’ve got a user interface class with many user options that you need to set/get at the same time. Here’s one way to implement this:
class CUI{public: CUI() : m_bOption(false), m_cOption(' '), m_iOption(0), m_dOption(0.0){} //... void GetOptions(bool bOption, char cOption, int& riOption, double&rdOption) { bOption = m_bOption; cOption = m_cOption; riOption = m_iOption; rdOption = m_dOption; } void SetOptions(bool bOption, char cOption, int const& riOption, doubleconst& rdOption) { m_bOption = bOption; m_cOption = cOption; m_iOption = riOption; m_dOption = rdOption; }private: //... bool m_bOption; char m_cOption; int m_iOption; double m_dOption;};
The problem with this implementation is that when the number of options increases, you need to transfer a larger amount of data as arguments to the getter/setter functions. This is not an efficient way to make use of the program’s stack. The solution is to create an inner structure containing all the options:
#include using namespace std;class CUI{public: struct SOptions { SOptions() : m_bOption(false), m_cOption(' '), m_iOption(0),m_dOption(0.0) {} bool m_bOption; char m_cOption; int m_iOption; double m_dOption; }; CUI() {} //... void GetOptions(SOptions& roOptions) { roOptions.m_bOption = m_oOptions.m_bOption; roOptions.m_cOption = m_oOptions.m_cOption; roOptions.m_iOption = m_oOptions.m_iOption; roOptions.m_dOption = m_oOptions.m_dOption; } void SetOptions(SOptions const& roOptions) { m_oOptions.m_bOption = roOptions.m_bOption; m_oOptions.m_cOption = roOptions.m_cOption; m_oOptions.m_iOption = roOptions.m_iOption; m_oOptions.m_dOption = roOptions.m_dOption; }private: //... SOptions m_oOptions;};