在 C++ 中使用类分配函数指针的最佳方法是什么?

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

我有一个第三方库,我必须像这样分配函数指针:

FunctionsStruct functionsStruct;

functionsStruct.firstFunctionPointer = myFirstFunction;
functionsStruct.secondFunctionPointer = mySecondFunction;
functionsStruct.thirdFunctionPointer = ...;

在myFirstFunction、mySecondFunction中我使用了共享变量。它看起来像这样:

void myFirstFunction(int a, int b) {
    sharedVariable = 56 * a;
    ...
}

void mySecondFunction(int c) {
    sharedVariable = 21 + c;
    ...
}

我当然可以这样写一段代码:

int sharedVariable;

void myFirstFunction(int a, int b) {
    sharedVariable = 56 * a;
    ...
}

void mySecondFunction(int c) {
    sharedVariable = 21 + c;
    ...
}

void setFunctionPointers() {
    FunctionsStruct functionsStruct;

    functionsStruct.firstFunctionPointer = myFirstFunction;
    functionsStruct.secondFunctionPointer = mySecondFunction;
    functionsStruct.thirdFunctionPointer = ...;
}

但我想避免全局/静态变量+有类。

所以对我来说最好的是这样的(我知道我不能将成员函数地址分配给函数指针 - 我正在寻找类似的东西):

class A {
public:
    A(int sharedVar): sharedVariable(sharedVar) {};
    int sharedVariable {};
    void myFirstFunction(int a, int b);
    void mySecondFunction(int c);
}

class B {
private:
    A a;
public:
     B() {};
     void setFunctionPointers();  
}

void B::setFunctionPointers() {
    functionsStruct.firstFunctionPointer = &a::myFirstFunction;
    functionsStruct.secondFunctionPointer = &a::mySecondFunction;
    functionsStruct.thirdFunctionPointer = ...;
}

那么最好的解决方案是什么?

c++ pointers
1个回答
0
投票

您可以使用 lambda 进行捕获,这取决于您的自定义,但我假设您有一个 shared_ptr 变量,所以我只是通过复制(增加引用计数)来捕获它。

正如您所说,您可以使用全局(在这种情况下很丑陋)或类,并且以这种方式,您可以使用 lamda(与在皮肤下声明的类相同)。


struct FunctionsStruct {
  std::function<void(int, int)> firstFunctionPointer;
  std::function<void(int)> secondFunctionPointer;
};
void setFunctionPointers() {
  FunctionsStruct functionsStruct;
  auto sharedVariable = std::make_shared<int>();
  functionsStruct.firstFunctionPointer =
      [sharedVariable](int a, int b) -> void { *sharedVariable = 56 * a; };

  functionsStruct.secondFunctionPointer = [sharedVariable](int c) -> void {
    *sharedVariable = 21 + c;
  };
}

int main() { return 0; }

© www.soinside.com 2019 - 2024. All rights reserved.