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成员变量的行为将返回到预期的值.有谁知道为什么会这样?提前致谢.
如果你看一下定义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++之前),并且讨厌被告知我的私人应该在底部,但是一旦你养成习惯,你会希望你早点改变.
| 归档时间: |
|
| 查看次数: |
410 次 |
| 最近记录: |