我正在用 C++ 开发一个非常小且简单的游戏引擎。我有一个生物类和一个武器类。该生物需要知道它拥有什么武器,并且每种武器都需要知道拥有它的生物。我希望武器知道生物拥有什么的主要原因是防止它摧毁自己的生物(当武器攻击时,会检测到与其碰撞的所有生物并杀死它们,除了拥有武器的生物)。
这是(简化的)Creature 类的样子:
class Creature {
private:
Weapon* weapon_;
public:
void SetWeapon(Weapon* w){
// do some other stuff (e.g. remove Weapon from any other Creatures)
weapon_ = w;
w->creature_ = this;
}
}
Run Code Online (Sandbox Code Playgroud)
(简化的)Weapon 类如下所示:
class Weapon{
friend class Creature; // Creature needs access to creature_ pointer
private:
creature_;
}
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,我将Creature设为Weapon的友元类,以便Creature的setWeapon()方法可以适当地设置私有的creature_指针。
我的具体问题:
我听说两个对象互相引用是糟糕的设计。但就我而言,我该如何不这样做呢?我真的“觉得”每个生物都应该知道它拥有什么武器,并且每个武器都应该知道它拥有什么生物(这样就不会伤害该生物)。有没有什么方法可以实现我想要的而不让这两个类相互引用?我在游戏引擎中的地图/实体、库存/物品等中一次又一次地遇到了同样的问题...似乎每当我有一个“Container”类和一个“Item”类时,这个引用问题就会再次出现。我想将添加项目的责任仅放在其中一个类中,但我希望两个类彼此了解(即我希望生物知道其武器,武器了解其生物)。有没有办法在不让两个项目相互引用的情况下实现这一目标?
这种设计有时是必要的吗?或者是否有一种通用方法可以始终避免它并实现相同类型的功能?
如果这种设计确实需要实现此类功能,那么使用友元类是处理它的正确方法吗?
预先非常感谢您。我非常有兴趣了解是否有一种方法可以在不让对象相互引用的情况下实现此类功能。
当函数需要返回一个对象时.它应该通过指向派生或基础的指针返回吗?
class B{
}
class D:public B{
}
// way 1: return pointer to derived
D* createDerived(){
D* d = new D();
return d;
}
// way 2: return pointer to base
B* createDerived(){
B* d = new D();
return d;
}
Run Code Online (Sandbox Code Playgroud)
我听说过"接口而不是实现的程序",这表明我们应该返回一个指向base的指针.但是我的直觉说在这种情况下返回指向派生的指针会更好,因为如果客户端代码使用基本指针,这个函数仍然可以工作!另一方面,如果我们返回指向base的指针而客户端代码使用派生指针,则这对它们不起作用.看起来通过返回一个更"特定"的指针,我们可以为客户端代码提供更大的灵活性.
另一种看待它的方式是从"合同计划"的角度来看.其中一个建议是尽可能少地承诺.通过承诺我们将返回一个非常具体的对象,我们遵循这个规则.但是,如果我们返回一个基本指针,在我看来,我们承诺更多.
哪个更好的设计?我的推理是否正确?
关于如何制作模块化,可维护,可扩展的软件,我有很多东西需要学习,所以请原谅我的推理/结论是否正常.我对学习很感兴趣.非常感谢您的参与.
这几行 python 3.2 代码使用最新的 pygame 模块来移动图像。它与这个例子有关:http : //www.pygame.org/docs/tut/MoveIt.html
这是我的代码:
import pygame
import sys
pygame.init()
screen = pygame.display.set_mode((600,400))
bg = pygame.image.load('bg.jpg')
player = pygame.image.load('player.jpg')
pos = player.get_rect()
while True:
for i in pygame.event.get():
if i.type() == pygame.QUIT:
sys.exit()
screen.blit(bg,(0,0))
screen.blit(player,(i,i))
pygame.display.update()
Run Code Online (Sandbox Code Playgroud)
这是我运行时遇到的错误:
回溯(最近一次通话):
文件“C:/Users/Grounds Keeper Willy/Desktop/Python Code/test.py”,第 12 行,在
if i.type() == pygame.QUIT:
TypeError: 'int'对象不可调用
我发现了类似的问题,但答案表明问题也使用函数名作为变量,这不是我正在做的。我似乎无法弄清楚这里出了什么问题。
c++ ×2
dependencies ×1
friend ×1
pointers ×1
polymorphism ×1
pygame ×1
python-3.x ×1
typeerror ×1