我做了一个控制台应用程序来做一些事情。它看起来像:
class C
{
public:
void print()
{
print("something that only class C knows");
}
}
//**************************************
class B
{
public:
void print()
{
print("something that only class B knows");
for_each(C c)
{
c.print();
}
}
private:
std::vector<C> c_classes;
}
//**************************************
class A
{
public:
void print()
{
print("something that only class A knows");
for_each(B b)
{
b.print();
}
}
private:
std::vector<B> b_classes;
}
并且在控制台中工作得很好,我可以从任何地方打印。
当我想将此应用程序移植到 GUI 时出现问题。我需要展示 A、B 和 C 类所知道的一切。最好的方法是什么?
我想让类 A 返回对类 B 向量的引用(它返回对类 C 向量的引用)并从 GUI 类中的每个实例中获取值。
但我不想让 GUI 类如此依赖于这些类。
有没有更好的方法可以做到这一点?
创建一个具有纯虚拟print()
方法(可能返回字符串)的公共接口Printable
,并在某处具有指向此对象的指针向量。将类A
、B
和C
派生自Printable
。因此,当您要打印每个对象的统计信息时,只需遍历此向量并显示输出即可。
从类层次结构中获取数据的一种好方法是使用访问者设计模式。 这样,将遍历层次结构(类似于您现在拥有的层次结构),并生成可供 GUI 使用的结果。 这个结果可以是一个 std::map,对象名称作为键,打印的字符串作为值;GUI 可以使用此映射来制作其表。
缺点是访问者最初会产生一些额外的复杂性,希望以后会得到回报。
其他答案的替代方法是实现一个"to_string()"成员,该成员存在于每个类中并返回一个包含相关数据的字符串(例如,这是所有 Java 程序中完成的方式)。
或者,您可以重载特定类的 ostream <<运算符。网上应该有很多描述如何做到这一点的例子。