从同一个类的另一个成员中引用类成员对象是不正确的做法吗?

问题描述 投票:0回答:1

我刚接触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背景)的新手,我试图了解类设计的原理和实践。从我已经阅读的内容看来,我似乎应该更喜欢...

c++ reference move-semantics member
1个回答
0
投票

代替这样做,您可以将“外部”保留为“内部”字段,可以完全使用它,而不必担心范围:

© www.soinside.com 2019 - 2024. All rights reserved.