是否有可能从对象的实例中获取指向成员的指针?
Was it possible to get a pointer to member from an instance of an object?
当这个编译器错误停止构建时,我正在将一些遗留代码移植到 VS 2015:
error C3867: 'OptDlg::GetFullModel': non-standard syntax; use '&' to create a pointer to member
转到相应的文件和行,我看到了这个:
Manager mgr = GetDocument()->GetManager();
OptDlg dlg;
...
mgr->SetFullModel(dlg.GetFullModel);
if ( dlg.GetFullModel )
mgr->SetSymm(...
GetFullModel
和SetFullModel
是两个不同classes中成员变量的getter/setter对:
class Manager {
...
bool GetFullModel() { return m_bFullModel; }
void SetFullModel(bool bFlag) { m_bFullModel = bFlag; }
....
};
class OptDlg {
...
void GetFullModel() { return m_bFullModel; }
void SetFullModel(bool bValue) { m_bFullModel = bValue; if ( bValue ) m_bInside = 0;}
是的,有些不对劲。 dlg.GetFullModel
应该是指向成员函数的指针吗?我认为那些使用 class 名称,而不是实例。更不用说这对执行语义意味着什么......
C++对我来说还是比较新的,所以我尝试了Google。它有很多函数指针,但它们看起来都与我的不同:
&OptDlg::GetFullModel // Standard-compliant
对
OptDlg::GetFullModel // The "normal" way to mess up getting a pointer to member, it seems
对
dlg.GetFullModel // ?
dlg.GetFullModel
只是获取成员函数指针的另一种方式吗?如果没有,"standard C++ version"是什么,如果有的话?这只是另一个 VS 6 "extensions" 吗?
它 强烈地 在我看来像是有人打错了 dlg.GetFullModel()
(这会调用该函数),而不是他们试图获取成员函数指针。
大概是遗留编译器让它滑动,在不使用 &
的情况下获取函数的地址并将非空函数指针转换为 bool
(值为 true)以传递到集合中功能。
&OptDlg::GetFullModel // Standard-compliant
如果您的参数类型应该采用成员函数,那就是您要使用的。但是他们采用布尔值。看起来您只是在函数调用中缺少括号,它应该是:
mgr->SetFullModel(dlg.GetFullModel());
if (dlg.GetFullModel())
mgr->SetSymm(...
可能有人忽略了警告(或没有警告),因此指针值(通过任何不正当手段产生)总是被解释为非 NULL,因此布尔值为真。
Is this just another one of those VS 6 "extensions"?
看起来是这样,尽管 是我能找到的唯一书面证据,它是 intentional/advertised "feature"。没有看到任何关于它被添加或删除的正式公告。
当这个编译器错误停止构建时,我正在将一些遗留代码移植到 VS 2015:
error C3867: 'OptDlg::GetFullModel': non-standard syntax; use '&' to create a pointer to member
转到相应的文件和行,我看到了这个:
Manager mgr = GetDocument()->GetManager();
OptDlg dlg;
...
mgr->SetFullModel(dlg.GetFullModel);
if ( dlg.GetFullModel )
mgr->SetSymm(...
GetFullModel
和SetFullModel
是两个不同classes中成员变量的getter/setter对:
class Manager {
...
bool GetFullModel() { return m_bFullModel; }
void SetFullModel(bool bFlag) { m_bFullModel = bFlag; }
....
};
class OptDlg {
...
void GetFullModel() { return m_bFullModel; }
void SetFullModel(bool bValue) { m_bFullModel = bValue; if ( bValue ) m_bInside = 0;}
是的,有些不对劲。 dlg.GetFullModel
应该是指向成员函数的指针吗?我认为那些使用 class 名称,而不是实例。更不用说这对执行语义意味着什么......
C++对我来说还是比较新的,所以我尝试了Google。它有很多函数指针,但它们看起来都与我的不同:
&OptDlg::GetFullModel // Standard-compliant
对
OptDlg::GetFullModel // The "normal" way to mess up getting a pointer to member, it seems
对
dlg.GetFullModel // ?
dlg.GetFullModel
只是获取成员函数指针的另一种方式吗?如果没有,"standard C++ version"是什么,如果有的话?这只是另一个 VS 6 "extensions" 吗?
它 强烈地 在我看来像是有人打错了 dlg.GetFullModel()
(这会调用该函数),而不是他们试图获取成员函数指针。
大概是遗留编译器让它滑动,在不使用 &
的情况下获取函数的地址并将非空函数指针转换为 bool
(值为 true)以传递到集合中功能。
&OptDlg::GetFullModel // Standard-compliant
如果您的参数类型应该采用成员函数,那就是您要使用的。但是他们采用布尔值。看起来您只是在函数调用中缺少括号,它应该是:
mgr->SetFullModel(dlg.GetFullModel());
if (dlg.GetFullModel())
mgr->SetSymm(...
可能有人忽略了警告(或没有警告),因此指针值(通过任何不正当手段产生)总是被解释为非 NULL,因此布尔值为真。
Is this just another one of those VS 6 "extensions"?
看起来是这样,尽管