我认为这是一个非常新的问题,但我从未找到答案。我不知道如何准确地说出这个问题,但我经常发现我必须在当前层次结构中访问与当前对象“相距很远”的对象。我只是想确保这是正确的(唯一)方法。
这也与从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()。
不要所有这些对子对象的调用(如果代码有点复杂)会得到很多开销吗?
感谢。
答案 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();
)