我有一个类A,在这个类A的实现文件,也就是A.cpp文件中声明了几个全局变量(不在任何函数内声明的应该是全局变量吧)
现在也就是在这个A.cpp文件中创建了一个线程,线程中需要访问这几个全局变量。createthread的时候传的是this指针,
然后在线程函数里转成A类的指针A_Ptr使用。同时,在A类中有一个B类的私有的指针变量B_Ptr。访问全局变量的时候是这样的:
A_Ptr->B_Ptr->一个B类的接口函数(在参数中访问了那几个全局变量);
但是编译的时候VC报错,错误为B_Ptr不能访问A类中声明的私有变量,但是我觉得我没有用到私有变量啊,难道那几个全局变量变成私有变量了?各位大虾帮帮忙,给小弟一个解决办法吧。

解决方案 »

  1.   

    全局变量只能被模块内访问,如果要在别的文件或者模块调用,需要将其声明前加extern,在使用的文件中包含其头文件即可.
      

  2.   

    1楼说得很对。但本人建议全局变量最好放在一个GlobalVar的文件里,最好是用类或结构进行封装一下。
      

  3.   

    我的全局变量的声明和使用它的线程函数在同一个文件中
    而且我在声明的时候加了extern还是不对,错误还是一样的,还是不能访问私有变量,我的这种情况不属于私有变量吧
      

  4.   

    class B{
    public:
    void test(){
    }
    };
    class A{
    private:
    B* pB;
    public:
    A(){
    pB = new B();
    CreateThread(threadTest,this);
    }
    public:
    static DWORD threadTest(void* p){
    A* pThis = (A*)p;
    pThis->pB->test();
    }
    };
    对于pThis而言,pB就是私有的,当然编译是通过不了的,把pB改成public就好了
      

  5.   

    如果在类中访问可以定义为友元类,楼主是在全局函数中访问,只能把B_Ptr->一个B类的接口函数封装成A类的一个
    函数去调用它,或者就把A类中的B对象变为公有成员。
      

  6.   

    say sorry to  IamNieo  和 bottlebox两位
    是我自己搞错了,问题已经更新为我在4楼的回复
    而且那个私有的友元类的指针变量不能改为public
    O(∩_∩)O谢谢
      

  7.   

    要不暴露一个访问这个私有变量的方法出来
    要不用boost::thread将线程方法改写为类成员函数,而不是静态函数
      

  8.   

    暴露一个访问这个私有变量的方法class A{
    private:
    B* pB;
    public:
    B* get_PB(){return pB;}
    }boost::threadclass B{
    public:
    void test(){
    }
    };
    class A{
    private:
    boost::shared_ptr<B> b_;
    public:
    A(){
    b_.reset(new B);
    boost::thread thd(&A::threadTest);
    }
    private:
    void threadTest(){
    b_->test();
    }
    };