使用以下代码段作为我的问题的插图:
// #includes and other macros
class MyClass : public CFormView
{
private:
DECLARE_DYNCREATE(MyClass)
bool privateContent;
...
public:
bool publicContent;
...
};
class MusicPlayer
{
public:
AppClass *theApp; // which has a pointer accessing the MyClass object instantiated in the program
...
}
当我在MyClass定义中放置关键字“private”时,当我尝试在MusicPlayer类的方法中访问privateContent成员变量时,privateContent成员变量似乎不是私有的。但是,如果我在DECLARE_DYNCREATE(MyClass)行之后放置“private”关键字,则privateContent成员变量的行为将返回到预期的值。有谁知道为什么会这样?提前谢谢。
答案 0 :(得分:9)
如果你看一下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:
个关键字,之后会将其余的类定义公开。
因此,当您在private:
之后说DECLARE_DYNCREATE
之后,您就会将其从公开更改为私有。
这个宏的通常用法是这样的:
class MyClass : public CFormView
{
DECLARE_DYNCREATE(MyClass)
private:
bool privateContent;
...
public:
bool publicContent;
...
};
该类在开始时将隐式隐私,因此效果相同。
此外,大多数C ++程序员都会同意你应该开始尝试将私有变量放在最底层。
理由是,当包括你自己在内的人正在阅读课程时,他们会希望看到你可以用公共界面中的课程做什么,而不是课程如何工作,这是私有的。
首先将公共界面放在首位,您不必为所有私人物品所困扰。
我过去也把我的私人内容放在首位(因为我来自Visual Basic 6,在C ++之前),并且讨厌被告知我的私人应该在底部,但是一旦你养成习惯,你就会希望你早点改变了。
答案 1 :(得分:0)
DECLARE_DYNCREATE
是包含public
关键字的宏。
实际上它包含宏DECLARE_DYNAMIC
,并且有public
个关键字。
答案 2 :(得分:0)
我认为DECLARE_DYNCREATE宏必须在内部使用public:identifier。为什么?如果更改上面的代码,以便在DECLARE_DYNCREATE宏之上声明privateContent,则它具有预期的行为。因此,我推断宏是“公共:”。所以你必须再次在宏之后声明适当的标识符。