如何在不传递类实例的情况下从静态成员函数调用非静态成员函数

问题描述 投票:0回答:4

我需要从同一个类的静态成员函数调用非静态成员函数。 静态函数是一个回调函数。它只能接收 void 作为数据,但我传递了一个 char* 。所以我无法直接向回调提供类实例。我可以将结构而不是字符传递给回调函数。任何人都可以给出例如在静态成员函数中使用非静态成员函数的代码。并利用静态成员函数中的结构体来使用类的实例来调用非静态成员函数?

c++ class static struct
4个回答
8
投票

通常这样的回调看起来像这样:

void Callback( void* data)
{
    CMyClass *myClassInstance = static_cast<CMyClass *>(data);
    myClassInstance->MyInstanceMethod();
}

当然,您需要确保数据指向您的类的实例。例如

CMyClass* data = new CMyClass();
FunctionCallingMyCallback( data, &Callback);
delete data;

现在,如果我理解正确的话,您还需要传递一个 char*。 您可以将两者包装在一个结构中,然后在回调中将其解开,如下所示:

MyStruct* data = new MyStruct();
data->PtrToMyClass = new CMyClass();
data->MyCharPtr = "test";
FunctionCallingMyCallback( data, &Callback);
delete data->PtrToMyClass;
delete data;


void Callback( void* data)
{
    MyStruct *myStructInstance = static_cast<MyStruct *>(data);
    CMyClass *myClassInstance = myStructInstance->PtrToMyClass;
    char * myData = myStructInstance->MyCharPtr;
    myClassInstance->MyInstanceMethod(myData);
}

或者,如果您可以修改 CMyClass 的定义,请将所有必要的数据放入类成员中,以便您可以像第一个示例中那样使用回调。


2
投票

如果您的实例是单例(通常使用私有或受保护的构造函数和指向自身的静态指针来实现),您可以执行以下操作:

class MyClass {
private:
  MyClass():myInstance(0) {}

  static MyClass *myInstance;

  void callback();
public:
  ~MyClass() {}

  static MyClass *getInstance();

  static void myCallback();    
};

MyClass *MyClass::getInstance() {
  if(!myInstance) {
    myInstance = new MyClass;
  }
  return myInsance;
}    

void MyClass::callback() {
 // non-static callback
}

void MyClass::myCallback() {
  getInstance()->callback();
}

如果您不使用单例,但可以将实例转换为

void *
那么您可以这样做:

void MyClass::myCallback(void *data) {
  MyClass *instance = static_cast<MyClass *>(data);
  instance->callback();
}

0
投票

这是唯一的方法:

#include <iostream>
#include <cassert>

struct A;
A *oneObj = NULL;


struct A
{
  A(){
    oneObj=this;
  }
  ~A(){
    oneObj=NULL;
  }
  void foo()
  {
  }

  static void boo()
  {
    assert( NULL != oneObj );
    oneObj->foo();
  }
};

int main()
{
  A onlyOne;
  A::boo();
}

0
投票

我需要从静态成员调用非

static
成员函数 功能相同
class
static
函数是一个回调。它可以 仅接收 void 作为数据,尽管我传递了
char*

这表明目前的设计是有缺陷或不正确的。恕我直言,你应该考虑改变设计。试想一下,如果您以某种方式让事情正常运转,那么代码的可维护性和可读性又如何呢?

我建议您将回调函数更改为不同的签名并进行相应的更改。

class A {
//...
  static void CallBack (A *pObj)
  {
    // logic
  }
};
© www.soinside.com 2019 - 2024. All rights reserved.