非静态和静态数据和功能

时间:2009-03-10 18:14:38

标签: c++ static

是否可以在静态成员函数中调用非静态数据成员? 是否也可以在静态成员函数中调用非静态成员函数?

你是怎么做到的?

9 个答案:

答案 0 :(得分:6)

是 - 你可以,这就是

class Foo
{
    public:
     static void staticFunc( const Foo &  foo)
     {
           foo.memberFunc();      

     }
      void memberFunc() const
      {
           staticFunc(*this);

      } 


}; 

这是一种设计,除了递归之外,演示了如何调用静态和非静态成员函数。

答案 1 :(得分:5)

由于人们总是倾向于贬低,这是摘要:

  

如果传入类实例或其指针或引用,则可以从静态成员函数中访问非静态成员。对象的限定条件(换句话说,静态成员签名)将决定您是否只能从内部调用constconstnon-const成员函数。

非静态成员数据/函数依赖于this指针 - 它基本上是指向访问/调用成员数据/函数的对象的指针。静态是类级别,不与单个对象关联。但是,如果将类实例/或实例本身的引用/指针传递给静态函数,则可以进行调用。

#include <iostream>
struct Eg {
 Eg() : x(42), y(-42) {}

static void foo(Eg const&f) {
    std::cout << "foo\n";
    f.bar();

    // we are good -- x is mutable
    std::cout << f.x << std::endl;
    f.x = 24;
    std::cout << f.x << std::endl;

    std::cout << f.y << std::endl;

    // you need non-const access for the following
    // so they don't work -- see foo signature
    //f.y = -24; compile error -- const l-value    

   // f.barbar(); same as above
}

void bar() const { // const required since we have a const reference
 std::cout << "bar\n";
}

void barbar() { // const required since we have a const reference
 std::cout << "bar\n";
}

  // note well the members
  mutable int x;
  int y;
};

int main() {
   Eg ex;

   Eg::foo(ex); // or ex.foo(ex);
}

看看Singleton / factory方法模式 - 你会对它们感兴趣。

答案 2 :(得分:4)

您需要对象的实例才能调用非静态成员函数或访问非静态数据成员。静态不具备它,所以通常它们不能,除非它们从某个地方得到一个(即,你有一个静态函数用来获取指向对象的指针的全局表。)

但静态不应该访问非静态数据。 。 。如果他们必须,他们不应该是静态的。你能告诉我们你想要做什么吗?

答案 3 :(得分:2)

您需要一些现有对象来调用非静态成员函数或访问非静态数据成员。

答案 4 :(得分:0)

通常情况下,除非你有一个指向实例的静态指针。

问题是静态方法没有特定的实例。如果传入实例,则可以调用非静态成员函数,否则调用no。

答案 5 :(得分:0)

不,除非你能以某种方式获得对定义类的实例的访问权,否则这是不可能的。

答案 6 :(得分:0)

两者都是:

class A {

   int x;

   void f() {
      staticfunc(); 
   }

   static void staticfunc() {
      A a;
      a.x = 42;
      a.f();
   }
};

当然上面的相互递归会引起一些问题: - )

答案 7 :(得分:0)

这种情况的典型用例是将C API回调交给C ++项目中的对象实例。

 // declared in some external C API
typedef void __stdcall EnumDataCallback( void* context, void* data );
void EnumData( EnumDataCallback* callback, void* context ); 

// in consuming C++ Project
class MyDataManager
{
public:
  void PollData()
  {
       ::EnumData( &MyObject::StaticEnumData, this );
  }
private:
  static void __stdcall StaticEnumData( void* context, void* data )
  {
    MyDataManager* instance = (MyDataManager*)(context);
    instance->EnumData( data );
  }
  void EnumData( void* data )
  {
    // actual callback code
  }
};

答案 8 :(得分:-1)

静态成员是类的一部分。这些是独立于任何其他类变量的数据成员。由于它们独立于其他类成员,因此可以使用范围解析运算符。这些是班上的全球成员。 而非静态成员是为类的实例创建的。