【问题标题】: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)?我希望该方法对每种卡片类型做一些不同但非常相似的事情。卡类型字段和取决于卡类型的区别不是一个合适的解决方案吗?

标签: c++ class methods


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    您所要求的通常称为高阶编程

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

    【讨论】:

    • 鉴于他们的第二段,我感觉操作员知道传递函数。
    • 事实上,问题的字面意思是他们不想这样做
    猜你喜欢
    • 2018-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-26
    • 2011-08-24
    • 1970-01-01
    相关资源
    最近更新 更多