Если вы посмотрите на определение DECLARE_DYNCREATE
, вы увидите, что он использует другой макрос:
// not serializable, but dynamically constructable
#define DECLARE_DYNCREATE(class_name) \
DECLARE_DYNAMIC(class_name) \
static CObject* PASCAL CreateObject();
И если вы посмотрите на этот макрос, DECLARE_DYNAMIC
, вы поймете, почему ваш класс становится общедоступным:
#define DECLARE_DYNAMIC(class_name) \
protected: \
static CRuntimeClass* PASCAL _GetBaseClass(); \
public: \
static const CRuntimeClass class##class_name; \
static CRuntimeClass* PASCAL GetThisClass(); \
virtual CRuntimeClass* GetRuntimeClass() const; \
Когда он развернется, он добавит это ключевое слово public:
, после чего оставшаяся часть определения класса станет общедоступной.
Поэтому, когда вы говорите «1012» после DECLARE_DYNCREATE
, вы меняете его с общего на частное.
Обычное использование этого макроса будет выглядеть так:
class MyClass : public CFormView
{
DECLARE_DYNCREATE(MyClass)
private:
bool privateContent;
...
public:
bool publicContent;
...
};
Класс неявно будет закрытым в начале, поэтому эффект тот же.
Кроме того, большинство программистов на C ++ согласятся с тем, что вам следует начать пытаться привыкнуть размещать свои личные переменные внизу.
Оправдание состоит в том, что когда люди, включая вас, читают класс, они захотят увидеть, что вы можете сделать с классом, который находится в общедоступном интерфейсе, а не как класс будет работать, что частный.
Ставя публичный интерфейс на первое место, вам не придется беспокоиться обо всех личных вещах.
Раньше я тоже ставил свои личные вещи наверх (потому что я пришел из Visual Basic 6, до C ++), и ненавидел, когда мне говорили, что мои рядовые люди должны быть внизу, но как только вы привыкнете, вы захотите ты изменился раньше.