gpt4 book ai didi

c++ - 世代相传的友元

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:55:09 27 4
gpt4 key购买 nike

现在,在你们开始肆虐之前,让我出去。是的,我承认它实际上是为了让友元不被继承,我只是想找到一些方法来获得类似的东西。这是我的情况(没有真正的代码,只是理论)。我正在研究一个简单的抽象游戏引擎框架,起初,我只是打算采用直接的面向对象/继承方法来分解对象类型。现在,它在纸面上听起来真的很棒,将实体分成物理、动画和不动场景及其所有子类别的子类别。然而,这变得危险,难以处理完全不同的对象的困惑和相当多的危险转换,如果我错过了我需要强制执行的东西而不是编译器,这很容易导致问题,这总是一个好兆头是更好的解决方案。

因此,我提出了一种不同的抽象表示对象的方法。我希望有一个实体类,所有实体都从中派生出一个包含 vector 的实体类,或者一些其他效果最好的动态可增长数组,它将包含我称之为行为的对象。行为将在指定时间后更新,这将影响指定对象的成员。以下是一些示例。

class Force : behavior;               
/*this would be a force, added to the behavior list and apply a constant
acceleration vector to the object until removed from the behavior list. (or
it's lifetime is exhausted) */

class attackThought : behavior;
/* For an ai, this would change how it reacts to a scenario by replacing or
even adding actions that it should perform given the change in position
or environment at update.*/

class animation : behavior;
/* You could create an animation, specify the animation that it is to perform,
add it to the behavior list, and during the time update, it will adjust the
vertex buffer accordingly, removing itself from the list when the animation
is done */

问题是,我想派生自一个基本行为类,它以不同的方式实现它的一些虚函数,这些函数主要改变实体对象的私有(private)成员(例如对象顶点缓冲区)。我不想操纵太多的基本实体代码,以便(在大多数情况下)可以像对待其他对象一样对待它,我只希望它们的行为完全可操纵/可推导。任何人都可以想办法让这个系统在 C++ 中工作,因为我认为它可能真的很酷:P。

顺便说一句,通过友元,我的意思是基类行为与一些派生实体类成为 friend ,这会影响它的私有(private)成员。例如,假设我有一个从实体派生的模型类,我想将一个称为动画的行为派生类作为 friend ,然后出于某种原因从模型派生一个类到更具体的对象类型,如何才能动画对象操纵这个新模型派生对象的私有(private)成员。

或者可以吗?也欢迎就此方法的可行性提出意见(只要它们确实包含批评)。

最佳答案

这些年来,我看到关于友元及其如何影响封装有两种不同的观点:

  • 它不会让成员对所有人公开,而是只让受控的实体子集可以访问它们,从而有助于改进封装。
  • 由于明显的经典原因,对象应该是自包含的,并且应该是修改其内部部分的唯一实体等,它减少了封装。

我倾向于避免使用友元并尝试解决它。我更喜欢封装所有东西,不仅仅是让它成为私有(private)的,而是能够在不影响类的用户的情况下改变它的内部实现方式。如果您希望基类能够修改派生类的属性,也许您可​​以考虑使用 Template Method设计模式。基类由此协调对派生类的调用方法,并确保在基类中定义通用的抽象操作方法。

至于“以防万一”将类的所有属性公开(听起来很危险),我认为最好先将它们全部设为私有(private),然后在需要时考虑将个别属性公开。

关于c++ - 世代相传的友元,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10794586/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com