MFC类中私有关键字的位置变量的差异

sta*_*tor 2 c++ mfc private-members

使用以下代码段作为我的问题的插图:

// #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

    ...
}
Run Code Online (Sandbox Code Playgroud)

当我在MyClass定义中放置关键字"private"时,当我尝试在MusicPlayer类的方法中访问privateContent成员变量时,privateContent成员变量似乎不是私有的.但是,如果我在DECLARE_DYNCREATE(MyClass)行之后放置"private"关键字,则privateContent成员变量的行为将返回到预期的值.有谁知道为什么会这样?提前致谢.

GMa*_*ckG 9

如果你看一下定义DECLARE_DYNCREATE,你会看到它使用另一个宏:

// not serializable, but dynamically constructable
#define DECLARE_DYNCREATE(class_name) \
    DECLARE_DYNAMIC(class_name) \
    static CObject* PASCAL CreateObject();
Run Code Online (Sandbox Code Playgroud)

如果你看一下这个宏,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; \
Run Code Online (Sandbox Code Playgroud)

当它扩展时,它将添加该public:关键字,之后将其余的类定义公开.

因此,当你说private:之后说DECLARE_DYNCREATE,然后你将它从公共变为私人.

通常使用这个宏将是这样的:

class MyClass : public CFormView
{
        DECLARE_DYNCREATE(MyClass)
private:
        bool privateContent;

        ...

public:
        bool publicContent;

        ...
};
Run Code Online (Sandbox Code Playgroud)

该类在开始时将隐式隐藏,因此效果是相同的.

此外,大多数C++程序员都会同意你应该开始尝试将私有变量置于底层.

理由是,当包括你自己在内的人正在阅读课程时,他们会希望看到你可以用公共界面中的课程来做什么,而不是课堂的工作方式,这是私人的.

通过首先放置公共接口,您不必为所有私有东西烦恼.

我过去常常将我的私人内容放在首位(因为我来自Visual Basic 6,在C++之前),并且讨厌被告知我的私人应该在底部,但是一旦你养成习惯,你会希望你早点改变.