C++:我可以将非静态成员变量的值分配给静态成员变量吗?
C++: Can I assign the value of non-static member variable to static member variable?
我有一个类A
,其中我有一个静态成员函数passName
int A::passName()
{
.... // skip some code
std::string name = ...; // result from codes above
assign(); // this is a static member function in class A
pointerA->passMethodName(name); // pointerA is a class-A static member variable, but of type
// class-B, passMethodName is a class-B non-static member function.
}
赋值函数为:
void A::assign(){
pointerA = tempPointerA;
}
说明: tempPointerA 是在运行过程中生成的值。它是一个非静态私有类 A 成员,每次构造类 A 的新对象时都会对其进行初始化。但是我知道在静态函数中我只能直接使用静态成员,所以我需要确保指针 A 是静态成员。那么 assign() 函数是否可行(或者我宁愿说,这里显示的整个工作原理是否可行)?
谢谢你的想法!
No.静态成员函数只能对静态变量进行操作或调用其他静态函数。(或命名空间范围的函数,它们或多或少与静态函数相同)。
§9.4.1 [类.静态.MFCT]
静态成员函数没有 this 指针。
因此,无法访问static
函数中的非静态成员变量。
如果你真的需要assign
保持static, then what you should do is to refactor your
assign() function to accept a variable of type
tempPointerA',然后传入你想要的变量。
int A::passName(B* _in)
{
std::string name = ...; // result from code above
assign(_in); // this is a static member function in class A
_in->passMethodName(name);
}
否则,我建议您根本不static
。
赋值将起作用,但您需要从非静态方法执行此操作(才能访问tempPointerA
)或将指针作为参数传递给静态方法。您可以从非静态函数访问静态成员(但不能相反)。
你应该注意的是所有权和破坏。由于您将值分配给静态成员,因此实例不能再拥有该值。否则,当实例被销毁时,静态成员指向垃圾数据,并且您会收到错误。此外,由于静态成员永远不会被销毁,因此您的值可能会泄漏资源(想想永远不会关闭的数据库连接)。
此外,如果您在多线程环境中,请考虑是否有可能多个线程尝试设置静态成员的值。您可能具有添加同步。如果多个线程尝试同时初始化值,也会遇到争用条件。
有一条规则:静态函数不能在没有对象的情况下访问非静态成员和同一类的函数。 没有相反的规则。 这是因为您没有this
指针。
您仍然可以在静态函数中声明同一类的对象并使用它的所有成员,或使用任何静态成员。
因此,您可以从非静态函数访问静态函数和成员。
如果pointerA
是静态的,您可以访问所有内容。 不仅是它的静态成员和函数。
- C++:是否可以使用非静态成员变量模板?
- 如何在复杂继承中访问静态成员变量
- 静态成员变量不会由 gettext 转换
- 为什么我不能像这样在静态成员函数中调用静态成员变量?
- C++ lambda - 捕获静态成员变量
- 多线程处理中的静态成员变量
- 纯标头库中静态成员变量的正确设置器和 getter
- 如何从具有专用化的类模板定义静态成员变量?
- 为什么可以在没有实例变量的情况下访问静态回调方法中的静态成员变量?
- 声明和定义类静态成员变量不会导致多重声明,这是为什么?
- 为什么不允许静态成员变量的初始化在类中,而允许静态静态成员的初始化
- 类中的静态成员变量和C++中的全局变量有什么区别?
- C++ 静态成员变量 - 文件之间的访问
- 如何在运行时使用静态成员函数初始化静态成员变量
- 模板类中嵌套类的C 静态成员变量
- 如何检查静态成员变量模板?
- 重载运算符和静态成员变量的行为
- 类的静态成员变量(受保护)的作用域
- gcc 和 clang 中 constexpr 静态成员变量的链接器错误
- dll 中静态成员变量的生存期