C ++访问远离当前类层次结构的对象

时间:2011-09-30 06:38:11

标签: c++ performance oop

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

这也与从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()。

不要所有这些对子对象的调用(如果代码有点复杂)会得到很多开销吗?

感谢。

5 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

这类问题的答案总是一样的:除非它成为问题,否则不要担心,然后,进行测量以确定哪个选项最佳。是的,调用子对象有一个开销,但是你给出的例子(以及许多实际例子)这个开销是不可避免的(编译器可能会优化其中的一些)。

答案 2 :(得分:0)

嗯,对于对称性,您可以放入A const B& get_b() const并执行

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

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

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

关于像你这样的链式函数调用的性能,现在没有太多担心函数何时返回简单的const引用。

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