2014-12-19 168 views
0

静态函数的问题在于它仅接受静态类变量和函数。解决方法是可能的。从C++中的静态方法访问非静态类变量

Class A{ 
int x; 
static void function() 
{ 
    A *a= new A(); 
    a->x; //this way we can access the non-static functions 
    free(a); 
    } 
} 

但让我们假设这种情况在队列中。

Class A{ 
queue x; 
static void function1() 
{ 
    A *a= new A(); 
    a->x.push(some argument); //this way we can access the non-static functions 
    free(a); 
} 

static void function2() 
{ 
    A *a= new A(); 
    a->x.pop(); //this way we can access the non-static functions 
    free(a); 
} 

}

每个功能1和功能2将创建自己的实例即队列,这意味着队列x是两者的功能不同。

我们怎样才能让两个函数都可以访问同一个队列,而不是使它变为静态的,请问有没有办法解决,请注意function1()和function2()在线程中并行运行。因此function1()是独立于function2()的,反之亦然。

+2

为什么没有达到静态要求?或者,为什么'functdion1'和'function2'需要是静态的? – 2014-12-19 05:21:03

+0

我不知道静态要求,但我被告知。函数1和函数2需要是静态的,因为它们是在单独的.h和.cpp实现中通过pthread_create函数传递的。 – Kamran 2014-12-19 05:32:38

+2

除了被问及回答的实际问题之外,你真的不应该把'a = new A()'与'free(a)'混合在一起。如果你有新东西,请删除它。如果你'malloc()'有东西,'free()'它。 – etheranger 2014-12-19 05:34:40

回答

1

我认为你需要首先检查你的设计为什么你需要这个。

顺便说一句,您可以将队列作为参数传递给函数。这将允许function1function2访问相同的队列。但是,因为它们并行,您可能需要锁定机制。 但是在调用function1/function2之前必须创建队列,他们不应该释放它。

static void function1(A *a) 
{ 
    a->x.push(some argument); //this way we can access the non-static functions 
} 

static void function2(A *a) 
{ 
    a->x.pop(); //this way we can access the non-static functions 
} 

我也觉得这种方式不是一种解决方法,但一个干净的解决方案。

+0

实际上,程序将以串行方式工作而不是并行方式,但我想这似乎是唯一的解决方案。谢谢! – Kamran 2014-12-19 05:30:41

+0

当我这样做pthread_create()参数期望function1(void *),并给出转换错误,任何想法? – Kamran 2014-12-19 05:48:09

+0

你可以将'void *'转换为'A *'。 – doptimusprime 2014-12-19 05:55:00