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

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

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

#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;
}

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

c++ class callback c++20 static-members
1个回答
0
投票

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

每次调用

foo
时,您都会更新
pThis
以指向当前/最新实例。这看起来更像是一个设计问题而不是编程问题。

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