【问题标题】:C++ accesing objects far from current class hierarchyC++ 访问远离当前类层次结构的对象
【发布时间】:2011-09-30 06:38:11
【问题描述】:

我认为这是一个非常新的问题,但我从未找到答案。我不知道如何准确地表达这个问题,但我经常发现我必须访问就当前层次结构而言与当前对象“相距甚远”的对象。我只是想确保这是正确(唯一)的方法。

这也伴随着从 main 传入参数。我发现一些远离main的对象需要多次传入参数。远离 main 的对象如何从命令行获取信息?

例如对于第一种情况,对于 4 个类...

class A{
   B b;
   //need to check status of D

   //choice 1
   b.get_c().get_d().get_status();  

   //choice 2
   const C& c = b.get_c();
   const D& d = c.get_d();
   d.get_status();
};

class B{
public:
   C c;
   const C& get_c() {return c;}
};

class C{
public:
   D d;
   const D& get_d() {return d;}
};

class D{
public:
   bool check_status();
};

比如说,A 是汽车,B 是门总成,C 是门,D 是锁。然后A必须检查说,是否锁定,否则阻止启动。

选择3是直接从A调用D的方法,我得在C、B、A做几层check_status(),然后返回D、C、B.check_status()。

所有这些对子对象的调用(如果代码稍微复杂一点的话)不会产生很多开销吗?

谢谢。

【问题讨论】:

    标签: c++ performance oop


    【解决方案1】:

    这类问题的答案总是相同的:除非问题成为问题,否则不要担心,然后进行衡量以决定哪个选项最好。是的,调用子对象会产生开销,但是对于您给出的示例(以及许多现实生活中的示例),这种开销是不可避免的(编译器可能会优化其中的一部分)。

    【讨论】:

      【解决方案2】:

      所有这些函数都是内联的,因为在类定义中声明,并且很简单return something;。它们返回引用,因此不涉及任何副本(请注意,它们可能应该是 const 成员函数,否则我看不到您的代码将如何编译)。根本不应该有任何开销,我建议您编译代码并查看生成的程序集以确保确定。

      【讨论】:

        【解决方案3】:

        好吧,为了对称起见,您可以将 const B& get_b() const 放在 A 中并执行

        get_b().get_c().get_d().get_status();
        

        这两个选择是完全等价的(编译器优化实际上可能产生相同的代码)。

        唯一的建议是将 getter 声明为 const X& get_x() const,因为它们不会修改所有者。

        【讨论】:

          【解决方案4】:

          除了上述答案之外,获取Large Scale C++ Software Design 的副本可能在这方面有所帮助。不用担心现在第一章有点无关紧要,提出的大多数想法仍然适用。

          【讨论】:

            【解决方案5】:

            关于像您这样的链式函数调用的性能,这些天来,函数返回简单的 const 引用时不必担心。

            但是,作为一个可能的设计缺陷,您通常应该使用直接对象并避免深入挖掘其他对象的数据。打个比方,当您想知道您的商家何时再次有货时,您可以直接询问他 (time = merchant.Availability(product);),而不要询问他的供货到达日期 (time = merchant. GetSupplyerForProduct(product). SupplySchedule(). NextArrival();)

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2011-09-23
              • 1970-01-01
              • 2012-09-27
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-05-19
              相关资源
              最近更新 更多