如何修改静态成员函数中的变量?

时间:2019-07-17 06:50:10

标签: c++ class static-methods class-members

我下面有一个代码,我想在静态函数中修改类的变量,但是有一些错误。 我该如何使用“ this”指针对其进行修复?

对于类中的静态成员,无法访问“ this”指针,另一方面,我试图在static成员函数中对类变量进行访问,因此,我正在寻找一种使用“ this”指针的方法属于“我”类的人。

class me {
  public:
     void X() { x = 1;}
     void Y() { y = 2;}

static void Z() {
  x = 5 ; y = 10;
}

public:
  int x, y;
};

int main() {
  me M;

  M.X();
  M.Y();
  M.Z();

  return 0;
}

我得到了这个error

  

在静态成员函数中无效地使用了成员“ me :: x”。

7 个答案:

答案 0 :(得分:3)

您有两种方法可以做到:

  • 如果在static方法中使用成员,则将其定义为static
  • static成员为class's时,请勿使用non-static方法

通常,static成员或methods的内存创建一次,即使您没有创建class的对象。因此,您不能在non-static方法中使用static成员,因为non-static成员仍然没有内存,而static方法却有内存...

尝试一下:

public:
   static void X() { x = 1;}
   static void Y() { y = 2;}

public:
   static int x;
   static int y;

不要忘记初始化static成员:

int me::x = 0;
int me:y = 0;

您不能在this方法内使用static指针,因为this只能在non-static成员函数内使用。注意以下内容:

this->x = 12;        // Illegal use static `x` inside a static method
me::x = 12;          // The correct way to use of `x` inside a static method

答案 1 :(得分:3)

您可以将指向实例的指针传递给方法:

class me {
public:
    void X() { x = 1;}
    void Y() { y = 2;}

    static void Z(me* this_) { // fake "this" pointer
      this_->x = 5 ;
      this_->y = 10;
    }

public:
    int x, y;
};


int main() {
    me M;

    M.X();
    M.Y();
    M.Z(&M);  // this works, but
    // usually you call static methods like this
    // me::Z(&M);

    return 0;
}

答案 2 :(得分:2)

静态方法只能访问静态成员。

class me {

  public:
void X() { x = 1;}
void Y() { y = 2;}

static void Z() {
  x = 5 ; y = 10;
}

public:
  static int x, y;
};

int main() {
  me M;

  M.X();
  M.Y();
  M.Z();

  return 0;
}

答案 3 :(得分:2)

您正在尝试使用静态成员函数中的非静态成员。这就是为什么它给您一个错误。

您可以通过使成员函数变为非静态(通过删除static关键字)来解决此问题。您还可以将变量设为静态,以便您的静态成员函数可以访问它,但是如果这样做,则其他两个函数仍将无法编译。

答案 4 :(得分:2)

除了@nivpeled说的以外,请考虑一下:

您可以在程序上创建me的多个实例。静态Z()方法应修改哪些实例?

答案 5 :(得分:0)

请阅读stackoverflow answer以获得更好的理解。 错误是由于访问该类的非静态成员引起的。请注意,此指针仅引用对象实例,并且只有非静态成员函数可以访问它们。 要使程序正常运行,请将变量设置为静态。

答案 6 :(得分:0)

在这里,我为您提供了最终的解决方案。

我问了很多次这个问题,但是人们没有思考或试图解决问题,而是开始判断我的设计,我认为这很有趣。

因此,我不得不解释一下,在某些情况下,您将需要使静态成员获得对非静态成员的访问权,例如,当您在程序中使用脚本接口(例如Lua)时,该接口只能访问静态成员。类成员,这些成员需要访问非静态成员,无论如何,让我们看看如何做到这一点。

class me {
  public:
     me() { This = this; } // Or you can assign it wherever you want
     void X() { x = 1;}
     void Y() { y = 2;}

static me* This; // Here is our "this" pointer :P
static void Z() {
  This->x = 5 ; This->y = 10;
}

public:
  int x, y;
};

//Remember to initialize it to avoid any linker's  errors
me* me::This = nullpter; // or NULL or even 0

int main() {
  me M;

// now you can access "this" pointer the usually way
  M.X();
  M.Y();
  M.Z();

  return 0;
}

经过一段时间的思考,这是我找到的最有效的解决方案。