gpt4 book ai didi

c++ - 变量在 MFC 类中放置私有(private)关键字的差异

转载 作者:太空狗 更新时间:2023-10-29 23:48:24 27 4
gpt4 key购买 nike

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

// #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) 行之后放置“private”关键字,则 privateContent 成员变量的行为将返回到预期的状态。有谁知道为什么会这样?提前致谢。

最佳答案

如果您查看 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: 关键字,然后将其余的类定义保留为 public。

因此,当您在 DECLARE_DYNCREATE 之后说 private: 时,您会将其从公共(public)更改为私有(private)。

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

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

...

public:
bool publicContent;

...
};

该类在开始时将隐式为私有(private),所以效果是一样的。

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

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

通过将公共(public)接口(interface)放在首位,您就不必被所有私有(private)的东西打扰。

我过去也把我的私有(private)内容放在顶部(因为我来自 Visual Basic 6,在 C++ 之前),并且讨厌被告知我的私有(private)内容应该放在底部,但是一旦养成习惯,您就会希望你改变得早。

关于c++ - 变量在 MFC 类中放置私有(private)关键字的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1127350/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com