【问题标题】:calling function of another class through its function address通过函数地址调用另一个类的函数
【发布时间】:2014-07-29 04:16:22
【问题描述】:

我试图通过函数的地址调用另一个类的函数。 我有两个课程 CA 和 CB

CA 有类似的方法

void CA :: CreateList()
{
    m_pWindow = DEBUG_NEW CA;
    if(! m_pWindow ->Create(_T("CListsdbb"),NULL,WS_CHILD|WS_VISIBLE|LVS_ICON|LVS_SINGLESEL                          , CRect(0, 0, 0, 0), this, NULL))
    {
        TRACE0("Falied to create list window");
        return;
    }
}

m_pWindow是CWnd*类型CA的属性。

我还有另一个班级 CB。我试图在其中调用此函数 无效的创建列表();

喜欢

void CB :: OnBtn(void)
{
    &CA::CreateList;
    MessageBox(_T("Hello world"), _T("Information"),  MB_OK);
}

但是函数没有调用。 CA 是集装箱船 CB 的所有者。

请任何人帮助我解决这个问题。

【问题讨论】:

  • 试试CA::CreateList();
  • 我试过了但没有给出错误 non-static member reference must be relative to an object。而 CreateList() 是公开的:
  • 如果 CA 是 CB 的所有者,请尝试 ((CA*)GetParent)->CreateList();
  • 请澄清您所说的“CA 是集装箱船 CB 的所有者”是什么意思。
  • CA 是集装箱船中 CB 的所有者,CA 是 CB 的父代

标签: c++ mfc


【解决方案1】:

你拥有的那行没有调用任何东西,它只是给出了函数的地址。一个指向成员函数的指针,并调用它,在 C++ 中是这样的:

void (CA::*func_pointer)() = &CA::CreateList;

CA a;
a->*func_pointer();

是的,语法被延迟了,有一段时间我记得我办公桌上的 Stroustrup 页面中讨论了此功能,因为我不得不经常查找它(基本上每次我使用它时)。

但我离题了——不过我应该提到的是,在 2014 年你真的不应该再使用它了;使用一个信号/槽来为你抽象出来。

此外,从您的示例中,我不确定 CB 应该如何访问 CA 的实例,也不确定“CA 是集装箱船中 CB 的所有者”。意思。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-28
    • 1970-01-01
    • 2019-03-25
    • 1970-01-01
    • 2014-02-20
    • 1970-01-01
    相关资源
    最近更新 更多