是否有可能从对象的实例获取指向成员的指针?

时间:2016-10-24 17:50:09

标签: c++ visual-studio-6

当这个编译器错误停止构建时,我正在将一些遗留代码移植到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(...

GetFullModelSetFullModel是两个不同类中成员变量的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应该是指向成员函数的指针吗?我以为那些使用类名,而不是实例。更不用说这对执行语义意味着什么......

C ++对我来说还是比较新的,所以我尝试了谷歌。它在函数指针上有很多,但它们看起来与我的不同:

&OptDlg::GetFullModel // Standard-compliant

VS

OptDlg::GetFullModel // The "normal" way to mess up getting a pointer to member, it seems

VS

dlg.GetFullModel // ?

dlg.GetFullModel只是另一种获取成员函数指针的方法吗?如果没有,那么什么是“标准C ++版本”,如果有的话?这只是VS 6“扩展”中的另一个吗?

2 个答案:

答案 0 :(得分:4)

  

&OptDlg::GetFullModel // Standard-compliant

如果你的参数类型应该是成员函数,那就是你要使用的。但他们采取布尔。看起来你的函数调用只是缺少括号,它应该是:

mgr->SetFullModel(dlg.GetFullModel());
if (dlg.GetFullModel())
    mgr->SetSymm(...

可能有人忽略了警告(或者没有使用它们),因此指针值(通过任何阴暗的方式产生)总是被解释为非NULL,因此布尔值为真。

  

这只是VS 6“扩展”中的另一个吗?

看起来似乎是这种情况,虽然this comment是唯一记录在案的证据,我发现它是一个有意/广告的“特征”。没有看到任何正式声明它被添加或取出。

答案 1 :(得分:3)

强烈对我来说就像有人误导dlg.GetFullModel()(会调用该函数),而不是他们试图获取成员函数指针。

可能遗留的编译器让它滑动,在不使用&的情况下获取函数的地址,并将非空函数指针转换为bool(值为true)以传递给set函数。