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

时间:2009-07-14 19:02:48

标签: 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

    ...
}

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

3 个答案:

答案 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,则它具有预期的行为。因此,我推断宏是“公共:”。所以你必须再次在宏之后声明适当的标识符。