如何在c ++中的静态方法中使用非静态实例?

时间:2013-01-14 15:04:37

标签: c++

我有一个lasse1的实例,我想在lasse2的方法中使用它,这个方法是静态方法,这只是不起作用:

 class Lasse2{
 ......
public :
static void function(void);
Lasse1* obj;
........
};

现在我想使用它:

void Lasse2::function(void){
obj->dosmt(); // this doesn't work 
.........

任何想法我该如何解决这个问题?

4 个答案:

答案 0 :(得分:2)

如果要访问班级的实例成员,则必须拥有该班级的实例。没有办法解决这个问题。您的选择是:

  1. 使obj成为静态成员。如果您打算为此类的所有实例设置单个obj,请执行此操作。
  2. 从function()中删除static,使其成为实例方法。
  3. 如果你不能做其中任何一个,那么你需要找到一种方法将实例指针传递给你的函数。例如,需要函数指针的API通常具有一种机制,用于在最终调用时将指针大小的数据传递给该函数。

答案 1 :(得分:1)

更改静态方法以显式传递对象指针:

static void function(Lasse1* obj)
{
    obj->dosmt(); 
}

但在你做之前,请考虑一下你真正想做的事情(如果你愿意,甚至可以写下另一个问题)。

答案 2 :(得分:1)

你需要一个班级实例来解决这个问题。

创建一个或通过其他方式接收它(函数参数,全局变量,类静态变量等)

答案 3 :(得分:0)

SLaks说得最好:“你不能”

原因如下:

当你声明一个成员变量(不是静态的,参见上面的obj)时,你告诉编译器每个Lassie2类型的对象都包含一个指向Lassie1的指针。 / p>

当声明一个静态方法时,这意味着它独立于该类的所有实例(实际对象)。它不对某个对象进行操作。

因此,在Lasse2::function内部,没有this,没有Lassie2对象可供您获取obj指针。