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

时间:2012-09-25 15:02:14

标签: c++ class project

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

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类如此依赖这些类。

有没有更好的方法呢?

3 个答案:

答案 0 :(得分:2)

创建一个具有纯虚拟Printable方法的公共接口print()(可能返回一个字符串),并在某处有一个指向这个对象的指针向量。课程ABC来自Printable。因此,当您想要打印每个对象的统计数据时,只需遍历此向量并显示输出。

答案 1 :(得分:1)

从类层次结构中获取数据的一种好方法是使用visitor design pattern。这样,遍历层次结构(类似于您现在拥有的层次结构),并且可以使用GUI的结果。这个结果可能是一个std :: map,对象名为key,打印字符串为value; GUI可以使用此映射来创建其表。

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

答案 2 :(得分:1)

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

或者,你可以重载ostream&lt;&lt;特定班级的操作员。网上应该有很多例子来描述如何做到这一点。