【问题标题】:cannot call member function without object error无法在没有对象错误的情况下调用成员函数
【发布时间】:2014-02-14 09:43:14
【问题描述】:

我在 ClassA 中有一个静态 funcA,它在 classA 中调用非静态 funcB。虽然我给 funcB 调用提供了对象,但我仍然得到错误:不能调用没有对象的成员函数

void* ClassA::funcA(void *arg)
{
   ClassA *pC = reinterpret_cast<ClassA *>(arg);

   funcB(pc);
}

void* ClassA::funcB(ClassA *arg)
{

}

这是什么原因?

【问题讨论】:

  • 如错误消息所述,您需要一个对象。该方法不是静态的。
  • 我给了pc,它是对象指针。还不够吗?
  • 如果这是问题所在,它会抱怨这些论点。

标签: c++ oop static-members


【解决方案1】:

可以在没有对象的情况下调用静态类方法,就像您正在做的那样。
需要在对象上调用常规类方法,如下所示:objectInstance.classMethod( arguments go here )objectPointer-&gt;classMethod( arguments go here )

试试这个(在你的类声明中更改 funcB 的签名以匹配之后):

void* ClassA::funcA(void *arg)
{
   ClassA *pC = reinterpret_cast<ClassA *>(arg);

   pC->funcB();
}

void* ClassA::funcB()
{
    ...
}

【讨论】:

    【解决方案2】:

    问题是调用 funcB 应该通过一些对象来完成,例如:

    pC->funcB(pC);
    

    实际上,这种代码更像 C 而不是 C++,因为如果您在对象上调用方法,则无需将其作为参数传递。

    【讨论】:

    • 如果funcB 仅适用于一个对象,则应将其设为静态,否则不应带参数。做你建议的只是多余的(大概问题中的pc只是一个打字错误,应该是pC)。
    • @Dukeling 我纠正了错误并解释了我的观点,谢谢:)
    【解决方案3】:

    您是从静态方法调用的,因此范围内没有接收器对象。

    因此,您不能调用非静态方法。

    你需要一个对象,它会收到消息:o.funcB(pc);

    【讨论】:

      【解决方案4】:

      从静态函数调用成员函数不是一个好主意,这里出错的原因是functionB是从静态方法调用的。静态方法不能调用非静态成员函数。原因是静态函数作用于类而不是对象。

      【讨论】:

        猜你喜欢
        • 2015-01-26
        • 1970-01-01
        • 2020-06-28
        • 1970-01-01
        • 2016-10-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-17
        相关资源
        最近更新 更多