【问题标题】:getters and setters in class课堂上的 getter 和 setter
【发布时间】:2011-05-10 23:10:17
【问题描述】:

考虑到我有大量对象(包含一些数据,例如 id、name 等),我正在尝试编写一个程序 我有一个类似的显示菜单:

1)

display_menu()
{
    vector< CD > CDArray;
    //some statements to display
    switch(choice)
    {
        //case1 , case 2, ...
        case x;
            for(int i=0; i < CDArray.size(); i++)
                CDArray[i].printCD(); //printCD() is a method of class CD
        //default
    }
}

但是如果向量/数组很大,会导致很多函数调用开销,从而使其变慢。

2) 我应该将函数 printCD() 声明为内联函数还是

3) 声明另一个对象来调用函数并通过引用传递向量/数组,例如:

display_menu()
{
    vector< CD > CDArray; 
    CD obj; 
    //some statements to display
    switch(choice)
    {
        //case1 , case 2, ...
        case x;
            obj.printCD(CDArray); //CDArray is passed by reference
        //default
    }
}

第三种方法有问题吗

你会建议什么方法?

【问题讨论】:

  • 在担心速度之前先测量一下速度。

标签: c++


【解决方案1】:

您已经过度分析问题了。先让它可读,然后再考虑性能。 100 次中有 99 次你认为是性能瓶颈的最大来源是错误的。

编辑

要真正回答这个问题,我会考虑面向对象的设计。您的 CD 对象是否需要知道如何将自己打印到屏幕上?一般来说,它是否需要了解有关 ostreams 的任何信息?我认为答案是否定的。在 C++ 中做这种事情的最好方法是有一个辅助函数,它重载 &lt;&lt; 运算符,以便它与 ostreams 一起工作,而不强制知道你的对象正在使用哪个流,或者有一个方法返回对象的字符串表示,因此您甚至不必担心字符串的去向。

【讨论】:

  • 虽然不是问题的答案,但在这种情况下作为最佳建议仍然值得 +1。
【解决方案2】:

第三种方法很好,这是一种全球通用的data-oriented 方式,看起来很合适。

但是:

这里您的函数不需要是成员函数,它适用于一组 CD 对象并且没有状态。所以你应该让它成为一个静态函数或全局函数。

我会设置一个命名空间和一个全局函数:

cdutil::print( CDArray ); 

但这在很大程度上取决于函数的语义。这里我完全不确定它是什么意思。

【讨论】:

    【解决方案3】:

    我会选择 CD 中的(静态)方法(或模板友元函数),它知道如何打印 CD 集合,由两个迭代器 beginend 引用。但是,这样做只是一个好主意,如果你真的需要在这里加速的话。

    【讨论】:

      【解决方案4】:

      您可以“扭转您的想法”并为 CD 类创建一个accept_visitor 方法,并创建一个 visitor 对象以传递给每个 CD 对象。这将为您以后在项目中提供更大的灵活性。如需更多信息,请联系网络并搜索“访问者设计模式”。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多