1

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

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

有没有更好的方法来做到这一点?

4

3 回答 3

2

Printable创建一个具有纯虚方法(可能返回一个字符串)的通用接口,print()并在某处有一个指向该对象的指针向量。有类ABC派生自Printable. 因此,当您想打印每个对象的统计信息时,只需遍历此向量并显示输出即可。

于 2012-09-25T15:13:18.590 回答
1

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

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

于 2012-09-25T15:30:17.290 回答
1

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

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

于 2012-09-25T15:41:23.603 回答