【问题标题】:Referencing a non-static class member in a static function [duplicate]在静态函数中引用非静态类成员[重复]
【发布时间】:2013-06-11 01:29:36
【问题描述】:

所以我有这样的东西:

//somewhere in the class header 
static void bar(); 
Someobj baz;


//meanwhile in the implementation
void foo::bar()
{
   baz.f()//this doesn't work b/c baz isn't declared as static
} 

我是否必须将我想在静态函数 foo 中使用的所有内容也声明为静态的,还是有更好的方法?

【问题讨论】:

  • 静态方法是非实例方法(即没有隐含的“this”指针),因此无法从静态方法中调用实例方法。您可以将指向您的类的指针或引用作为参数传递给您的静态方法,并通过该参数调用非静态方法。
  • @franji1:一个非常常见的误解——实例方法当然可以从 static 成员函数调用,方法是在对象上使用 . 成员访问运算符。
  • 建议的副本不正确,因为当前的标题问题具有误导性。投票重新开放。

标签: c++ static member


【解决方案1】:

是的,你知道。如果你有 10 个对象并且每个对象都有自己的baz,那么bar 应该如何知道你在说哪个baz

不能。这就是为什么你也只能有一个baz,一个静态的。

【讨论】:

    【解决方案2】:

    静态函数就像全局函数,它们没有关联的实例,因此您不能引用实例成员。如果您需要与此类关联的单个 baz 对象,请将其设为静态。否则,你需要改变你的逻辑。

    【讨论】:

    • 我将如何改变逻辑?我正在使用 opengl,它的显示和重塑功能本质上都是静态的,如何调整?
    • 如果你的静态方法可以接受参数,让它传递正确的 baz 作为参数。其他任何内容,您都需要某种全局方式来访问它。
    • 您可以将 baz 作为参数传递,但也许您需要将 bar 作为实例函数。您也可以使 baz 成为静态的。或者,你可以让 bar 成为一个独立的函数。
    猜你喜欢
    • 1970-01-01
    • 2021-12-03
    • 1970-01-01
    • 1970-01-01
    • 2014-07-13
    • 2011-05-31
    • 1970-01-01
    • 1970-01-01
    • 2012-04-13
    相关资源
    最近更新 更多