c++ - 继承的友元

标签 c++

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

因此,我提出了一种不同的抽象表示对象的方法。我希望有一个实体类,所有实体都派生自该实体类,其中包含一个 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。

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

或者可以吗?关于这种方法的可行性的意见也受到欢迎(只要它们实际上包含批评)。

最佳答案

多年来,我发现对于友元及其如何影响封装有两种不同的观点:

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

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

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

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

相关文章:

c++ - SetDIBits 可以直接绘制到屏幕或监视器吗?

c++ - ceil, floor 和 round 转换成整数会不会遇到精度丢失的问题?

c++ - 将派生类型的对象从 python 传递到期望 shared_ptr 为基类型的 C++ 函数时,Boost Python 运行时错误

c++ - 如何链接到 Windows 7 64 位 Visual Studio 2012 中的 VTK 库?

c++ - 参数值相等时的模板特化

c++ - 分配的结构包含 vector 的内存泄漏

c++ - 在 SQLAPI c++ 中向 IN 子句添加多个参数

c++ - 在 cygwin 终端中运行时显示不存在的文件夹的 cmake 错误

c++ - 在 Mac OS X 上共享一个 c++ 库,这样我就可以将用户定义的函数添加到 mySQL

c++ - objective-c++ 如何将方法添加到 c++ 类中