如何从C++中的静态成员函数访问非静态成员
How to access a non-static member from a static member function in C++?
我写了以下代码:
class A
{
public:
int cnt;
static void inc(){
d.cnt=0;
}
};
int main()
{
A d;
return 0;
}
我看到了这个问题:
如何在不传递类实例的情况下从静态成员函数调用非静态成员函数
但我不想用指针。我可以不使用指针吗?
编辑:
我看到了以下问题:
如何从java中的静态方法访问非静态成员?
为什么我不能做那样的事?
正如其他人所指出的,您需要访问对象才能对其执行操作,包括访问其成员变量。
从技术上讲,您可以像下面的zeroBad()
函数一样编写代码。但是,由于您无论如何都需要访问该对象,因此不妨将其作为一个成员函数,如zeroGood()
:
class A
{
int count;
public:
A() : count(42) {}
// Zero someone else
static void zeroBad(A& other) {
other.count = 0;
}
// Zero myself
void zeroGood() {
count = 0;
}
};
int main()
{
A a;
A::zeroBad(a); // You don't really want to do this
a.zeroGood(); // You want this
}
更新:
您也可以在C++中实现Singleton
模式。除非你有一个非常具体的原因,否则你可能不想这么做。辛格尔顿被许多人认为是一种反模式,例如因为它很难测试。如果你发现自己想要这样做,重构你的程序或重新设计可能是最好的解决方案。
如果不使用指针,就不能在静态函数中使用非静态成员变量或函数。
您本身不需要指针,但确实需要访问访问非静态变量的对象。在您的示例中,对象d对A::inc()不可见。如果d是一个全局变量,而不是main的局部变量,那么您的例子就可以了。
也就是说,很奇怪你为什么要尽一切努力避免在C++中使用指针。
相关文章:
- 如何在C++中使用非静态成员函数作为回调函数
- 静态成员函数使用相同的名称时出现模板类型名称错误
- 在 nullptr 上调用无状态类的非静态成员函数是否合法?
- 为什么传递非静态成员函数会导致编译错误?
- 处理类内的回调时,必须调用对非静态成员函数的引用
- 非静态成员函数的 decltype 格式不正确吗?
- std::异步与非静态成员函数
- C++无效使用非静态成员函数?
- 未使用的C++未优化的静态成员函数/变量
- C++:如何返回指向非静态成员函数的指针?
- 使用静态成员函数而不是普通函数是否有任何开销?
- 在 stream_descriptor::async_wait 中无效使用非静态成员函数
- 为什么我不能像这样在静态成员函数中调用静态成员变量?
- 无法在clang Linux中分配非静态成员函数,但我可以在Visual Studio Windows中分配
- 在类定义中推导内联静态成员函数的返回类型
- `enable_if()`以禁用模板化类的静态成员函数声明
- 错误:无效使用非静态成员函数"int test::hotplug_callback(libusb_contex
- 常量静态成员函数
- 使用 vector.sort() 的非静态成员函数无效使用
- 从静态成员函数访问私有非静态类变量 - C++