如何组织更大的多类 GUI 项目



我做了一个控制台应用程序来做一些事情。它看起来像:

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,并在某处具有指向此对象的指针向量。将类ABC派生自Printable。因此,当您要打印每个对象的统计信息时,只需遍历此向量并显示输出即可。

从类层次结构中获取数据的一种好方法是使用访问者设计模式。 这样,将遍历层次结构(类似于您现在拥有的层次结构),并生成可供 GUI 使用的结果。 这个结果可以是一个 std::map,对象名称作为键,打印的字符串作为值;GUI 可以使用此映射来制作其表。

缺点是访问者最初会产生一些额外的复杂性,希望以后会得到回报。

其他答案的替代方法是实现一个"to_string()"成员,该成员存在于每个类中并返回一个包含相关数据的字符串(例如,这是所有 Java 程序中完成的方式)。

或者,您可以重载特定类的 ostream <<运算符。网上应该有很多描述如何做到这一点的例子。

最新更新