我刚接触C ++(具有Java背景),并且试图了解类设计的原理和实践。
从我已经读过的书开始,我似乎更喜欢将类成员作为对象而不是将它们作为指针(或引用)。 -如果这有误,请纠正我。
基于此,这是我的设计(版本1):
class Outer {
Some_type _member;
Inner _inner;
};
class Inner {
Some_type* _ptr_to_outer_member;
};
我知道,必须确保引用对象(Outer._member)
的生存期超过引用对象(Inner)
及其指针_ptr_to_outer_member
的生存期,以避免指针悬空。 _inner
是_outer
的组合,而Outer._member
是对象成员,因此必须始终对其进行初始化。
现在我当然不需要Outer
可复制。甚至不需要移动,因为在完成所有设置之后就不应该移动它-尽管在构造其他对象时让它移动很方便。无论如何,当Outer
移动时,_inner._ptr_to_outer_member
都会失效。 -可以通过禁用Outer
的复制和移动操作来防止此情况,但是感觉好像是在解决不好的做法。有一条指导方针说避免存储对堆栈分配的变量的引用,在我看来,这种情况似乎可以避免类似的原因。
我可以看到的另一种方法是像这样(版本2)堆分配_member
:
class Outer { std::unique_ptr<Some_type> _member; Inner _inner; }; class Inner { Some_type* _ptr_to_outer_member; };
[
Outer
现在是可移动且不可复制的,这是我想要的,但这是堆分配_member
的开销,这与有关首选对象成员的准则背道而驰。
因此,我想到了这个问题:是否有任何指导方针?我的意思是当您想要共享对象时(例如在设计版本2中)喜欢使用指向对象的指针作为成员-这对我来说可能最有意义(除非我遗漏了一些东西)。或者仅禁用此类对象的移动(如设计版本1中一样),并处理为不可移动的对象。
或者这些示例在根本上有问题吗?
谢谢您对此的任何见解。
我是C ++(具有Java背景)的新手,我试图了解类设计的原理和实践。从我已经阅读的内容看来,我似乎应该更喜欢...
代替这样做,您可以将“外部”保留为“内部”字段,可以完全使用它,而不必担心范围: