我做了一个控制台应用程序,可以做一些事情。它看起来像:
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类如此依赖这些类。
有没有更好的方法呢?
答案 0 :(得分:2)
创建一个具有纯虚拟Printable
方法的公共接口print()
(可能返回一个字符串),并在某处有一个指向这个对象的指针向量。课程A
,B
和C
来自Printable
。因此,当您想要打印每个对象的统计数据时,只需遍历此向量并显示输出。
答案 1 :(得分:1)
从类层次结构中获取数据的一种好方法是使用visitor design pattern。这样,遍历层次结构(类似于您现在拥有的层次结构),并且可以使用GUI的结果。这个结果可能是一个std :: map,对象名为key,打印字符串为value; GUI可以使用此映射来创建其表。
缺点是访问者最初会产生一些额外的复杂性,希望以后可以获得回报。
答案 2 :(得分:1)
其他答案的替代方法是实现“to_string()”成员,该成员存在于每个类中并返回带有相关数据的字符串(例如,这是在所有Java程序中完成的方式)。 / p>
或者,你可以重载ostream&lt;&lt;特定班级的操作员。网上应该有很多例子来描述如何做到这一点。