2013-03-01 94 views
4

我正在C++中为一个健康俱乐部运行一个模拟应用程序。用户只需在开始时输入模拟数据(3个整数值)并按下运行。之后,没有用户输入 - 非常简单。C++输出:GUI或控制台?

开始模拟后,很多逻辑都在较低的类中深入了解,但其中很多需要将简单的输出消息打印到UI。返回消息是不可能的,因为对象需要打印到UI,但仍然可以继续工作。

我打算将UI对象的引用传递给所有需要它的类,但我最终将它传递给了相当多 - 必须有更好的方法。

我真正需要的是可以调用UI的printOutput(string)函数的方法,它比cout < string更容易(或者更难)。

UI还具有displayConnectionStatus(bool []连接)方法。

请记住,UI继承了一个抽象的“UserInterface”类,所以简单的控制台UI和GUI可以轻松地进出。

你如何建议我实现这个链接到UI?

如果我要使用全局函数,如何重定向它以调用我选择使用的UserInterface实现的方法?

+1

全球单? (这实际上是什么cout是在你想要的用法。) – metal 2013-03-01 18:19:19

+0

你有没有考虑使用日志框架(例如log4cpp) – 2013-03-01 18:19:56

+0

@ David Hope我从来没有听说过它。 – Armada 2013-03-01 18:22:10

回答

4

不要害怕全局变量。

全局对象伤害封装,但对于不需要立即重用的关注解决方案,全局对象就好了。

公开一个处理来自仿真的事件的全局对象。然后,您可以选择打印事件,通过电子邮件发送它们,使用OpenGL或任何您喜欢的方式渲染它们。制作一个统一的界面,通过报告回调来捕捉模拟内部发生的情况,然后您可以对这个全局对象进行子类化以适应您的需求。

如果对象不是全局对象,则会在所有代码库中传递指针。

+0

我第一次按'编辑'而不是'评论' - 是漫长的一天。无论如何,我要说的是 - 我会不得不通过指针,这会让人讨厌,但每个人似乎都一直说全局变差:S – Armada 2013-03-01 18:21:26

+2

人们喜欢绝对真理。规则比谨慎评估更容易,因为他们几乎总是善于注意。但是,它们并不普遍。使用全局对象有很好的理由 - 地狱,甚至有'goto'的合法用法(Linux内核广泛使用它),并且每个人都会告诉你'goto'是PLAIN EVIL(tm)。 – slezica 2013-03-01 18:26:28

+0

在一段时间内维护全局变成了一个真正的问题,特别是在多线程环境中,我们面临的问题很难识别,过去我不得不使用一个广泛使用全局变量的项目,摆脱由于这些怪异的行为,所以我个人认为我们应该去全球只有当没有其他解决方案... – Saqlain 2013-03-01 18:30:47

0

我建议去登录框架,即你自己的类LogMessages,它获得的数据和记录数据的功能,它可以是一个用户界面,文件,通过网络或任何东西。

而每个需要日志记录的类都可以使用你的日志类。

这样就可以避免全局和通用的解决方案,也看看http://www.pantheios.org/这是开源的C/C++诊断日志API库,你可以使用也......

+0

我稍微编辑了我的问题。字符串输出方法不是UI中唯一的方法。它也有一个showConnectionStatus(bool [])方法。 – Armada 2013-03-01 18:31:31