(C++) 将'this'作为默认参数传递给静态方法

4
很明显像这样static void DoSomething(ClassPointer* MyPtr = this) 的做法是行不通的,因为静态方法没有this。然而当我调用这个DoSomething时,我总是传递来自调用它的类的this,我不想每次都这样做。
如果有一种方式可以从静态方法内部获取调用它的类的引用,那么这将起作用,但据我所知并没有这种方法。
我有哪些选择?

8
如果你总是传递'this',那为什么这是一个静态成员函数? - user5335028
6
如果您总是使用实例来调用静态方法,为什么不将其改为非静态方法呢?我的翻译是否清楚明了? - songyuanyao
它从一个更大的项目中的各个类中被调用,调用它的类的实例很重要。 - Vii
@Vii 这意味着你的 ClassPointer (或其他)有一个 ->isOnServer() 方法。 所以这是他们都愿意拥有和提供的常见定义。 问题是,只要有一个公共地方来放置 ->isOnServer() 的定义,为什么不在同一方法列表中旁边放置 ->DoSomething() 并正常获取 this 指针。 如果您想将某些实现代码放在另一个类中,则可以调用 OtherClass::DoSomethingCore(this),但这只需编写一次。 - HostileFork says dont trust SE
@immibis 这个宏应该怎么写?我用过宏,但没用过在方法里。 - Vii
显示剩余6条评论
2个回答

1
如果需要将请求对象的上下文作为引用传递,我建议使用非静态实例方法。这样,您可以在方法内部引用类的其他实例成员。如果行为取决于子类,则可以使用可重写虚方法。

我认为他的意思是他有许多不同的类都调用这个静态方法(比如可能它注册了一个回调监听器),而包含这个静态方法的类与调用者不在同一继承层次结构中,因此你需要传递指向调用者类的指针,以便稍后可以使用传入的指针来调用调用者类中的成员函数。如果它是一个成员函数,那么它必须存在于每个继承层次结构中,而不仅仅是eventListener类。有没有办法做到这一点? - Jerry Jeremiah
有趣。好的,C++支持多重继承,因此您实际上可以拥有一个基本实现,可以由任何需要它的类进行扩展,不是吗?我喜欢你关于回调方法的想法。还可以考虑访问者模式https://en.wikipedia.org/wiki/Visitor_pattern - Mark Roper

1
编写宏。
#define DoSomethingX(...) DoSomething(this, __VA_ARGS__)

并调用

StaticFunctionClass::DoSomethingX(par1, par2);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接