Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;访问远离当前类层次结构的对象_C++_Performance_Oop - Fatal编程技术网

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

C++ C++;访问远离当前类层次结构的对象,c++,performance,oop,C++,Performance,Oop,我认为这是一个非常新的问题,但我从未找到答案。我不知道如何准确地表达这个问题,但我经常发现,根据当前层次结构,我必须访问距离当前对象“很远”的对象。我只是想确定这是正确的(唯一的)方法 这还需要从main传入参数。我发现一些远离main的对象需要多次使用参数传入。远离main的对象如何从命令行获取信息 例如,对于第一种情况,对于4个类 class A{ B b; //need to check status of D //choice 1 b.get_c().get_d

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

这还需要从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是锁。然后一个必须检查的说,是锁定,否则阻止启动

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

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


谢谢。

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

好吧,为了对称性,您可以将a
常量B&get_B()常量

get_b().get_c().get_d().get_status();
这两个选项是完全等价的(编译器优化实际上可能产生相同的代码)


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

这类问题的答案总是一样的:除非它成为一个问题,否则不要担心它,然后,采取措施来决定哪个选项是最好的。是的,对子对象的调用会产生开销,但是对于您给出的示例(以及许多实际示例),这种开销是不可避免的(而且编译器可能会优化其中的一部分)。

除了上面的答案之外,在这方面,获取的副本可能会有所帮助。不要担心现在第一章有点不相关,所介绍的大部分思想仍然适用。

关于像您这样的链式函数调用的性能,现在函数返回简单常量引用时不需要太担心

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