从另一个类访问类的变量而不使第一类静态

时间:2014-12-19 11:54:59

标签: c++ static

class A{
    static queue x;
    void operateOnQueue()
    {
        x.push(something);
    }
} 

class B{
    void getOtherClassQueueSize()
    {
        A *a= new A();
        cout<<a->x.size()<<endl; \\ size of queue is 1
        // OR alternatively
        cout<<A::x.size()<<endl;
        delete(a);
    }
}

如何在getOtherClassQueueSize()中访问B类中相同的A类队列而不使其成为静态?如果不使它静止,我将得到size = 0.有没有解决方法?

这些函数在线程中运行以保持并行性。另一种方法是传递函数参数,但我试图避免它。

2 个答案:

答案 0 :(得分:0)

如何不让x静态? 然后,如果它是公开的,你可以通过如下指针直接访问它:

//assume 'a' points to an object who's stack has already been filled somewhere else, then:
cout << a->x.size(); //prints the size of member 'x' of 'a'

或者您可以将其设为私有并公开getter / setter或其他修饰符

答案 1 :(得分:0)

如果static不是一个选项,并且你必须通过A实例访问队列,那么使用引用或指向队列的单个实例的指针初始化类A的obj可能是可能的。您还可以尝试填充一个映射,其中键以某种方式从类型派生,每个类型的单个实例是值。

此处显示了包括原文在内的两个示例:online example

简而言之:

使用引用或指向队列的单个实例的指针初始化A类的obj:

std::deque<int> global_x;
struct Anew{
   std::deque<int>& x;
   Anew() : x(global_x) {}
};

填充一个映射,其中键以某种方式从类型派生,每个类型的单个实例是值:

std::map<int, std::deque<int> > mapxs;
struct Anew2{
   enum { type_as_int_so_no_rtti_is_needed = 1 };
   std::deque<int>& x;
   Anew2() : x(mapxs[type_as_int_so_no_rtti_is_needed]) {}
};