如何为类的每个实例创建实例特定的方法?

Posted

技术标签:

【中文标题】如何为类的每个实例创建实例特定的方法?【英文标题】:How to create instance specific methods for each instance of a class? 【发布时间】:2019-05-27 11:40:13 【问题描述】:

我正在用 C++ 制作纸牌游戏,并使用 onClick() 方法制作了一个按钮类。每张卡片都将成为一个按钮,但我不希望每张卡片在点击时做不同的事情。有没有办法通过为每个实例重写 onClick() 函数来做到这一点,而不是创建 50 个不同的类方法或 50 个不同的类?

我尝试为每个不同的实例创建一个函数并将其作为类中的字段传递。然后,onClick() 函数充当每个实例的包装器,并调用在 Button 构造函数中作为参数传递的函数,但我试图避免在 Button 构造函数中添加函数参数。

【问题讨论】:

卡片的onClick()函数有什么区别? 这真的取决于,你可以根据情况,创建一堆组件并让每张卡包含相关组件的集合。但这可能是矫枉过正,我认为最简单的事情可能是您建议将函数传递给按钮的构造函数。但这只是在每个函数都足够独特的情况下,如果没有更多上下文,很难给出明确的答案。另外,“但我试图避免在 Button 构造函数中添加函数参数”背后的原因是什么? 这是否可以作为 XY 问题的示例 (meta.stackexchange.com/questions/66377/what-is-the-xy-problem)?我希望该方法对每种卡片类型做一些不同但非常相似的事情。卡类型字段和取决于卡类型的区别不是一个合适的解决方案吗? 【参考方案1】:

有许多可能的解决方案。在我的 min 中突然出现的一个问题是,您可以拥有一个由 50 个函数指针(或者更确切地说是 std::function 对象)组成的数组,每个指针指向一个函数来处理特定的“卡”。或者只使用一个这样的 std::function 对象,您可以在构造函数初始化程序列表中将其初始化为正确的函数(例如)。

如果函数之间的差异很小,也许将它收集到一个函数中会更明智,并且有例如一个switch 声明来做一些不同的具体部分?

【讨论】:

【参考方案2】:

您所要求的通常称为高阶编程和function-objects

在c++ 中,您可能想使用例如。 std::function(std-function) 并将其存储在卡片类中 - 就像你说的。但是由于您不想在构造函数中传递它(为什么?),您可以将成员设为可选,例如。 std::optional<std::function<void()> >

【讨论】:

鉴于他们的第二段,我感觉操作员知道传递函数。 事实上,问题的字面意思是他们不想这样做

以上是关于如何为类的每个实例创建实例特定的方法?的主要内容,如果未能解决你的问题,请参考以下文章

如何为用户显示特定的 ec2 实例

如何为创建大量实例节省内存?

让一个类的每个实例都知道另一个类的一个特定实例的最佳方法是啥?

如何为组件的每个实例触发 vue 生命周期事件?

python_如何为创建大量实例节省内存?

XML De/Serialization:如何为类的不同实例的相同属性定义不同的名称