2015-04-29 31 views
0

我正在构建一个组件系统,其中抽象类型Component是从组件继承而来的。到目前为止,我有可绘制的,物理的,可移动的和其他组件。一切似乎进展顺利,并在Game I类执行以下操作:防止未经授权使用组件

void Game::init() 
{ 
    pPlayer->addComponent(pMovable); 
} 

void Game::processEvents() 
{ 
    if (sf::Keyboard::isKeyPressed(sf::Keyboard::W)) 
     pMovable->moveUp(2.f); 

    // etc.. 

    pPlayer->setVelocity(pMovable->getVelocity()); 
} 

void Game::update() 
{ 
    pPlayer->update(0); 
} 

void Game::play() 
{ 
    while (pWindow->isOpen()) 
    { 
     // ... 
     processEvents(); 
    } 
} 

到目前为止,该组件系统是很基本的,简单的。玩家的类型为Object,每当我打电话给玩家的更新函数时,我也会调用Object的更新函数。这应该是真正的自动化,但这将在未来发生变化。什么是真正的问题是这样的:

pPlayer仍然可以访问pMovable的速度即使它没有添加pMovable作为组件。这是有问题的,因为这意味着任何人都可以简单地从pMovable获得速度,然后将其插入到对象中,而不必将pMovable作为其组件的一部分添加。现在,倾向于发生的事情是,由于没有可移动的组件来调节它,因此移动变得不受管理。我认为这是对这个组件的未经授权的使用,我想要开发一种组件可以拒绝将它的功能用于它不属于的对象的方式。这个问题有很多解决方案,我需要一个高效实用的解决方案。这里是我的:

  1. 如果客户端试图分配一个组件功能到它自己没有添加它;

  2. 创建一个系统,通过该系统识别对象和组件,并且组件跟踪它拥有的对象,并且对象跟踪它拥有的组件。因为这是一种多对多的关系,所以必须创建一个管理所有这些的中间类;它也避免了一个循环的头文件。

  3. 有一个函数不是简单'停用'的对象的一部分。这需要使用像“componentAdded”这样的布尔值,并且所有函数都必须检查组件是否被添加,否则该函数将不会做它应该做的事情。

如果您有其他的解决方案,以防止未经授权使用的组件,请分享它们的我渴望向别人学习它们如何实现的/或将实现一个组件系统,因为我在这里做。

+3

[MCVE](http://stackoverflow.com/help/mcve)。我个人发现很难理解你对'pMovable'的看法。 – AndyG

+0

我不认为你的答案是有帮助的。我已经说过'pMovable'是一个组件,并且隐式地是一个可移动的组件。它具有我不希望非所有者对象不具有的功能。 – Poriferous

+3

我同意@AndyG,一个MCVE会有帮助。如果您在代码中显示完整的示例*,我们可以更容易理解您的需求。*您可能认为已经用口头解释了足够的*,但是一个人认为他们已经沟通和其他人都了解。 – Brian

回答

0

你不能阻止特定的类继承。这是一个全有或全无的命题:任何类都从基础继承或没有。

最好的你可以希望的是缩小界面。例如,您可能想要使用类Stationary_ObjectEnemy_Object来优化接口,而不是允许功能中的Object的后代。这使您可以编写采用任何Enemy_Object并且不会采用Stationary_Object(如树或墙)的函数。

编辑1:与朋友
可以通过声明成员为私有,并使用friend类授予访问特定的类允许成员访问作弊。问题是,只要创建新类型的朋友,就需要修改包含数据的类。我相信这种使用friend的船破坏了可重用性的目的。

编辑2:检测所有权
比方说,我们有三类:

class Engine; 

class Car 
{ 
    Engine car_engine; 
}; 

class Boat 
{ 
    Engine boat_engine; 
}; 

和一个功能:

void Fix_Car_Engine(Engine& e) 
{ 
} 

有一个在C++中没有方法为Fix_Car_Engine知道它正在修理汽车引擎或船引擎。该函数只知道它已经被赋予了一个通用的引擎来解决(或者只知道变量的常见引擎的东西)。

这个问题可以通过优化或缩小的界面得到缓解:

class Car_Engine : public Engine; 
class Boat_Engine : public Engine; 

class Car 
{ 
    Car_Engine diesel_engine; 
}; 

class Boat 
{ 
    Boat_Engine propellor_engine; 
}; 

在上面的例子中,发动机类有两个专业:Car_EngineBoat_EngineCar现在有一个Car_Engine成员和Boat有一个Boat_Engine

的功能现在可以创建特殊发动机运转:

void fix_boat_engine(Boat_Engine& be); 
void fix_car_engine(Car_Engine& ce); 

fix_car_engine现在只能用汽车发动机工作原理。你可以说它适用于任何拥有汽车发动机的车型(只要你通过汽车发动机成员)。同样,fix_boat_engine函数只能在船引擎上运行。

鉴于:

class Rocket_Engine : public Engine; 

此外,这种专业化防止Rocket_Engine被传递给任一功能。这些功能需要特定的引擎类型。

+0

我不想阻止特定的类继承。我只是不希望组件被没有拥有组件的对象使用。 – Poriferous

+0

如何判断对象A是否拥有对象B?我可以创建一个包含Engine实例的结构Car。功能如何知道发动机属于汽车还是船? –

+0

@不拥有组件的多孔对象将无法访问该组件_unless您将其引用到component_。所以停止给它参考。还是你使用全局变量? (facepalm) – developerbmw