C++ C++;访问远离当前类层次结构的对象
我认为这是一个非常新的问题,但我从未找到答案。我不知道如何准确地表达这个问题,但我经常发现,根据当前层次结构,我必须访问距离当前对象“很远”的对象。我只是想确定这是正确的(唯一的)方法 这还需要从main传入参数。我发现一些远离main的对象需要多次使用参数传入。远离main的对象如何从命令行获取信息 例如,对于第一种情况,对于4个类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
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();
)