Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can i modify variables in static member function?

I have a code below, i want to modify class's variables in static function but there is some error. How can i fix it with "this" pointer?

There is no access to "this" pointer for static members in class,on the other hand I am trying to make an access to class variables in Static member function, therefore i am looking for a way to use "this" pointer of class "me" to do it.

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

I got this error :

invalid use of member ‘me::x’ in static member function.

like image 933
Baharmast Avatar asked Apr 20 '26 18:04

Baharmast


2 Answers

You have two ways to do it :

  • Define your members as static if they are used in a static method.
  • Implement Dont use of static methods when class's members are non-static

Generally, the memory of static members or methods created once even when you dont create an object of your class. So you cannot use of a non-static members in a static method, because non-static members still have no memory While static methods have memory...

Try this :

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

public:
   static int x;
   static int y;

Dont forget to initialize static members :

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

You cannot use of this pointer inside a static method, because this may only be used inside a non-static member function. Notice the following :

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
like image 180

You can pass a pointer to an instance to the method:

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;
}
like image 24
user1810087 Avatar answered Apr 24 '26 13:04

user1810087



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!