【问题标题】:Accessing non-static class variable from static methods in C++从 C++ 中的静态方法访问非静态类变量
【发布时间】:2015-02-18 00:57:05
【问题描述】:

静态函数的问题在于它只接受静态类变量和函数。一种解决方法是可能的。

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

}

每个 function1 和 function2 将创建一个自己的实例队列,即 a,这意味着队列 x 对于两个函数是不同的。

我们如何在不使其成为静态的情况下使两个函数都可以访问同一个队列,是否有解决方法,请注意 function1() 和 function2() 在线程中并行运行。因此 function1() 有点独立于 function2() ,反之亦然。

【问题讨论】:

  • 为什么需要without making it static?或者,为什么functdion1 和function2 需要是静态的?
  • 我不知道静态要求,但有人告诉我。 function1 和 function2 需要是静态的,因为它们在 .h 和 .cpp 实现中的单独的 pthread_create 函数中传递。
  • 除了提出和回答的实际问题之外,您真的不应该将a = new A() 与free(a) 混为一谈。如果你 new 某事,delete 它。如果你 malloc() 某事,free() 它。
  • pthread_create 期望一个指向采用void* 的函数的指针,并且还接受一个传递给所述函数的void* 参数。一种典型的方法是在那里传递this:您的function1 和function2 将有一个A* 指针可以使用。正如所写,没有参数,它们无论如何都不适合pthread_create。
  • @IgorTandetnik 你的意思是像 function1(A a) 但是当我这样做时 pthread_create() 参数需要 function1(void),并给出一个转换错误,任何想法?

标签: c++ static static-methods static-variables


【解决方案1】:

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

顺便说一句,您可以将队列作为参数传递给函数。这将允许function1 和function2 访问同一个队列。但是,由于它们是并行的,您可能需要锁定机制。 但是必须在调用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
}

我也认为这种方式不是一种变通方法,而是一种干净的解决方案。

【讨论】:

  • 实际上该程序将以串行方式而不是并行方式工作,但我想这似乎是唯一的解决方案。谢谢!
  • 当我这样做时,pthread_create() 参数需要 function1(void*),并给出转换错误,有什么想法吗?
  • 您可以将void * 转换为A*。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-22
  • 2012-06-29
  • 2012-07-17
  • 1970-01-01
  • 2017-01-13
  • 2011-01-17
  • 2013-02-13
相关资源
最近更新 更多