RoynCheng 2022-11-18 13:45 采纳率: 50%
浏览 11
已结题

C++类中静态函数如何访问非静态成员变量

问题遇到的现象和发生背景

ClassB中有一个静态函数,是ClassA的回调函数show,但是show函数需要用到ClassB中的非静态变量,该如何操作?

用代码块功能插入代码,请勿粘贴截图
#include <iostream>
#include <functional>
#include <windows.h>
class A
{
    using CallBack = std::function<void(int a)>;
public:
    void SetCallBack(const CallBack& pf) {
        callback = pf;
    }
    void run() {
        int i = 0;
        while (1)
        {
            callback(i++);
            Sleep(1000);
        }
    }
private:
    CallBack callback;
};

class B
{
public:
    B() {
        m_pthis = this;
        m_i = 0;
    }
    void run(){
        m_a.SetCallBack(show);
        m_a.run();
    }
private:
    static B *m_pthis;
    static void show(int a) {
        std::cout << m_pthis->m_i <<","<< a <<std::endl;
    }
    int m_i;
    A m_a;
};

void main()
{
    B b;
    b.run();
};
运行结果及报错内容
错误    LNK2001    无法解析的外部符号 "private: static class B * B::m_pthis" 
我想要达到的结果
  1. 运行报错的原因
  2. 如何在ClassB的静态方法中,访问ClassB的非静态变量
  • 写回答

3条回答 默认 最新

  • 关注

    逻辑挺绕, 但是没有问题, 只是语言基本功不扎实.
    .
    静态成员, 除个别只用于内部使用的常量, 其余均需类内声明, 类外定义.

    #include <functional>
    #include <iostream>
    #include <windows.h>
    
    class A
    {
        using CallBack = std::function<void(int a)>;
    
      public:
        void SetCallBack(const CallBack &pf)
        {
            callback = pf;
        }
        void run()
        {
            int i = 0;
            while (true)
            {
                callback(i++);
                Sleep(1000);
            }
        }
    
      private:
        CallBack callback;
    };
    
    class B
    {
      public:
        B()
        {
            m_pthis = this;
            m_i = 0;
        }
        void run()
        {
            m_a.SetCallBack(show);
            m_a.run();
        }
    
      private:
        static B *m_pthis;
        static void show(int a)
        {
            std::cout << m_pthis->m_i << "," << a << std::endl;
        }
        int m_i;
        A m_a;
    };
    
    // 定义
    B *B::m_pthis;
    
    auto main() -> int
    {
        B b;
        b.run();
    };
    
    
    本回答被专家选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 10月2日
  • 专家已采纳回答 9月24日
  • 修改了问题 11月18日
  • 创建了问题 11月18日

悬赏问题

  • ¥15 GDI处理通道视频时总是带有白色锯齿
  • ¥20 用雷电模拟器安装百达屋apk一直闪退
  • ¥15 算能科技20240506咨询(拒绝大模型回答)
  • ¥15 自适应 AR 模型 参数估计Matlab程序
  • ¥100 角动量包络面如何用MATLAB绘制
  • ¥15 merge函数占用内存过大
  • ¥15 Revit2020下载问题
  • ¥15 使用EMD去噪处理RML2016数据集时候的原理
  • ¥15 神经网络预测均方误差很小 但是图像上看着差别太大
  • ¥15 单片机无法进入HAL_TIM_PWM_PulseFinishedCallback回调函数