如何使用静态内联成员指针和静态成员函数正确的实例?

mac*_*e_1 2 c++ class callback static-members c++20

我有一个静态回调成员函数,它通过静态内联指针调用非静态窗口过程成员函数。问题是,它最终调用了最后一个实例。这是一个演示问题核心的例子:

#include <iostream>

struct A {
    static inline A* pThis;
    int i;     

    A(int i) : i(i) {
        pThis = this;
    }

    static void foo() {
        std::cout << pThis->i << std::endl;
    }
};

int main() {
    A a1(1); 
    A a2(2); 

    a1.foo(); // prints 2 instead of 1
    a2.foo(); // prints 2 as expected

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

请注意,我无法更改回调函数的签名,因此建议让 foo 接受参数是徒劳的。我该如何解决这个问题?

use*_*570 6

问题是,它最终调用了最后一个实例

每次您使用要A::A(int)更新的构造函数创建对象pThis以指向当前/最新实例时。因此,当您a2使用创建时A a2(2);pThis会更新为指向这个新对象。

这看起来更像是一个设计问题而不是编程问题。