2014-01-17 52 views
0

我有81个名为Square的对象位于另一个称为Puzzle的对象中的二维数组中。我想让它在一个单独的Square对象中触发某个函数时,会在其相应的Puzzle对象中触发一个函数。你会如何建议去做?它甚至有可能吗?如何获取成员对象以通知其容器对象?

+0

你可以传递给父母'Puzzle'的引用给每个对象,让他们调用函数。或者你可以让调用者调用Puzzle对象的函数,也可以调用网格位置,所以'Puzzle'对象可以调用右边的'Square'函数。或者你可以变得很花哨,并且使用['Boost.Signals'](http://www.boost.org/doc/html/signals.html)等方式将消息从“Square”传递给订阅的任何对象被通知。 – Praetorian

+0

对于您发布的第二种可能的解决方案:在另一个调用内的对象将如何作为外部对象的成员函数?我确实为每个“Square”记录了一个网格位置,因为我看到过类似的问题,并试图从中收集解决方案。但是我没有找到一个。 我真的认为你的第一个解决方案是最好的,但我想尽可能地使用尽可能少的指针,所以我欢迎其他解决方案。一个人可以做梦... –

+0

我想你误解了我的第二个建议。而不是拥有任何你现在调用'Square'成员函数的函数,而是让该函数调用'Puzzle'的成员函数。如果调用者也通过网格位置,则“Puzzle”可以调用正确的“Square”的成员函数。 – Praetorian

回答

0

最简单的方法做到这一点,而无需修改SquarePuzzle类是封装两者Square方法调用和函数的Puzzle触发代码。 A(有点做作)的例子是:

void GoUp(Square& sq, Puzzle& pz) { 
    sq.GoUp(); 
    pz.NotifySquareGoUp(sq); 
} 

现在需要调用GoUp()方形物体通知拼图对象的任何代码,只需要调用的函数。

1

您试图实现的内容可以通过实施“观察者模式”来完成。您的拼图对象将注册Square对象中的事件。 Square对象在状态改变时通知拼图。以下链接将帮助您弄清楚如何做到这一切。

http://www.codeproject.com/Articles/328365/Understanding-and-Implementing-Observer-Pattern-in

+0

我其实已经开放了一下,另一位朋友推荐了一样。但是,他给出的示例代码中提供的情况与我目前的情况不太吻合。在他的代码中,'Shop'对象是观察者,它是'DummyProduct'类继承的'ASubject'类的成员。在我的系统中,我希望'Puzzle'类是观察者,'Square'类是主题,这使得事情变得复杂,因为'Puzzle'具有一个Square,但Square不具有' Puzzle'。 –

+0

这个想法是以这样一种方式编写通知函数,以便它可以帮助您识别唯一方形的参数。 Square广场>的addObserver(猜谜) 在广场: 功能通知(){ 对(INT I = 0; I 通知(本); } } – GizmoThunder

0

你的意思是回调函数?

您可以存储一个指针或引用到Square中,当Square的某个函数被调用时,您可以通过指针/引用来做些事情。