нестатические и статические данные и функции - PullRequest
4 голосов
/ 10 марта 2009

Можно ли вызывать нестатический элемент данных в статической функции-члене? И возможно ли также вызывать нестатическую функцию-член в статической функции-члене?

Как ты это делаешь?

Ответы [ 9 ]

6 голосов
/ 10 марта 2009

ДА - можно, а вот как

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

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

      } 


}; 

Это своего рода проект, за исключением рекурсии, демонстрирующий, как вызывать как статические, так и нестатические функции-члены.

5 голосов
/ 10 марта 2009

Так как люди одержимы понижением, вот краткое изложение:

Вы можете получить доступ к нестатическому члену из статической функции-члена при условии, что вы передадите экземпляр класса ИЛИ указатель на него ИЛИ ссылку. Квалификация объекта (другими словами, статическая подпись члена) будет определять, можете ли вы вызывать только const или обе функции-члена const и non-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 - они будут вам интересны.

4 голосов
/ 10 марта 2009

Вам необходим экземпляр объекта, чтобы вызвать нестатическую функцию-член или получить доступ к нестатическому члену данных. У статики этого нет, поэтому, как правило, этого нет, если только они не получены откуда-то (т.е. у вас есть глобальная таблица, которую статическая функция использует для получения указателя на объект.)

Но статика не должна обращаться к нестатическим данным. , , если они должны, они не должны быть статичными. Можете ли вы показать нам, что вы пытаетесь сделать?

2 голосов
/ 10 марта 2009

Вам понадобится какой-нибудь существующий объект для вызова его нестатической функции-члена или для доступа к его нестатическому члену данных.

0 голосов
/ 27 июня 2013

статические члены являются частью класса. Это члены данных, которые не зависят от любой другой переменной класса. и поскольку они не зависят от других членов класса, оператор разрешения области видимости может использоваться с ними. это глобальные члены в классе. в то время как нестатические члены создаются для каждого экземпляра класса ..

0 голосов
/ 11 марта 2009

Типичный вариант использования этого - передача обратных вызовов 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
  }
};
0 голосов
/ 10 марта 2009

Да обоим:

class A {

   int x;

   void f() {
      staticfunc(); 
   }

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

Конечно, взаимная рекурсия в приведенном выше вызовет несколько проблем: -)

0 голосов
/ 10 марта 2009

Нет, это невозможно, если вы не можете каким-то образом получить доступ к экземпляру определяющего класса.

0 голосов
/ 10 марта 2009

Не обычно, если у вас нет статического указателя на экземпляр.

Проблема в том, что у статического метода нет конкретного экземпляра, на котором он работает. Вы можете вызвать нестатическую функцию-член, если передадите экземпляр, но в противном случае - нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...