2

使用以下代码片段作为我的问题的说明:

// #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 成员变量似乎不是私有的。但是,如果我将“private”关键字放在 DECLARE_DYNCREATE(MyClass) 行之后,privateContent 成员变量的行为就会恢复到预期的状态。有谁知道为什么会这样?提前致谢。

4

3 回答 3

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:after时DECLARE_DYNCREATE,您就是在将其从 public 更改为 private。

这个宏的通常用法是这样的:

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

        ...

public:
        bool publicContent;

        ...
};

该类将在开始时隐式为私有,因此效果是相同的。

此外,大多数 C++ 程序员都会同意您应该开始养成将私有变量放在底部的习惯。

理由是当人们,包括你自己,在阅读这个类时,他们会想看看你可以用这个类做什么,这是在公共接口中,而不是这个类是如何工作的,这是私有的。

通过将公共接口放在首位,您将不必为所有私有内容所困扰。

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

于 2009-07-14T19:11:18.383 回答
0

DECLARE_DYNCREATE是包含public关键字的宏。实际上它包含宏DECLARE_DYNAMIC并且有public关键字。

于 2009-07-14T19:10:21.943 回答
0

我认为 DECLARE_DYNCREATE 宏必须在内部使用 public: 标识符。为什么?如果您更改上述代码,以便在 DECLARE_DYNCREATE 宏上方声明 privateContent,则它具有预期的行为。因此,我推断宏做了一个“公共:”。因此,您再次必须在宏之后声明适当的标识符。

于 2009-07-14T19:16:21.650 回答