如何修改静态成员函数中的变量?
How can i modify variables in static member function?
下面有一段代码,我想修改静态函数中class的变量,但是有一些错误。
我怎样才能用 "this" 指针修复它?
无法访问 class 中静态成员的 "this" 指针,另一方面,我试图访问静态成员函数中的 class 变量,因此我正在寻找一种方法来使用 class "me" 的 "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
:
invalid use of member ‘me::x’ in static member function.
静态方法只能访问静态成员。
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;
}
您有两种方法可以做到:
- 如果成员在
static
方法中使用,请将成员定义为 static
。
- 当
class's
成员是 non-static
时,不要使用 static
方法
通常,static
成员或 methods
的内存创建一次,即使您没有创建 class
的对象。所以你不能在 static
方法中使用 non-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;
您不能在 static
方法中使用 this
指针,因为 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
您正在尝试使用来自静态成员函数的 non-static 成员。这就是它给您错误的原因。
您可以通过使成员函数 non-static(通过删除 static 关键字)来解决此问题。您也可以将变量设为静态,这样您的静态成员函数就可以访问它,但是如果这样做,其他两个函数仍然无法编译。
加上@nivpeled 所说的,想想这个:
您可以在您的程序中创建多个 me
实例。静态 Z()
方法应该修改哪些实例?
您可以将指向实例的指针传递给方法:
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;
}
我在这里为您提供了最终的解决方案,哈哈。
我问过这个问题很多次了,但人们没有思考或尝试解决问题,而是开始评判我的设计,我认为这很有趣。
所以我必须解释一下,在某些情况下,您需要让静态成员获得对非静态成员的访问权限,例如当您在程序中使用脚本接口时(Lua)该接口只能访问 class 的静态成员,这些成员需要访问非静态成员,无论如何让我们看看如何去做。
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;
}
经过一段时间的思考,这是我找到的最有效的解决方案。
下面有一段代码,我想修改静态函数中class的变量,但是有一些错误。 我怎样才能用 "this" 指针修复它?
无法访问 class 中静态成员的 "this" 指针,另一方面,我试图访问静态成员函数中的 class 变量,因此我正在寻找一种方法来使用 class "me" 的 "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
:
invalid use of member ‘me::x’ in static member function.
静态方法只能访问静态成员。
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;
}
您有两种方法可以做到:
- 如果成员在
static
方法中使用,请将成员定义为static
。 - 当
class's
成员是non-static
时,不要使用
static
方法
通常,static
成员或 methods
的内存创建一次,即使您没有创建 class
的对象。所以你不能在 static
方法中使用 non-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;
您不能在 static
方法中使用 this
指针,因为 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
您正在尝试使用来自静态成员函数的 non-static 成员。这就是它给您错误的原因。
您可以通过使成员函数 non-static(通过删除 static 关键字)来解决此问题。您也可以将变量设为静态,这样您的静态成员函数就可以访问它,但是如果这样做,其他两个函数仍然无法编译。
加上@nivpeled 所说的,想想这个:
您可以在您的程序中创建多个 me
实例。静态 Z()
方法应该修改哪些实例?
您可以将指向实例的指针传递给方法:
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;
}
我在这里为您提供了最终的解决方案,哈哈。
我问过这个问题很多次了,但人们没有思考或尝试解决问题,而是开始评判我的设计,我认为这很有趣。
所以我必须解释一下,在某些情况下,您需要让静态成员获得对非静态成员的访问权限,例如当您在程序中使用脚本接口时(Lua)该接口只能访问 class 的静态成员,这些成员需要访问非静态成员,无论如何让我们看看如何去做。
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;
}
经过一段时间的思考,这是我找到的最有效的解决方案。