如何解决在另一个实例化一个类的首选方法是什么?
相当基本的问题。与设计偏好有关,但我认为有一些需要注意的地方。
我想在另一个类中包含某个类的实例。我看到的方式有3种选择:
-
将对象
class2
放在class1
内,如下所示。这意味着在构造class1
的实例时会构造它。我的问题是可能需要默认和/或复制构造函数?当我在下面实例化一个class1
对象时,它是否使用该构造函数构造class2_inst(args)
?还是已经使用某些默认构造函数创建了class2_inst
并且行class2_inst(args)
仅复制一个匿名class2
对象?class class2 { public class2(args) { ... } } class class1 { protected class2 class2_inst; public class1(args) : class2_inst(args) { ... } }
-
我可以有一个指向
class2
的指针:class class2 { public class2(args) { ... } } class class1 { protected class2* class2_inst; public class1(args) { class2_inst = new class2(args); ... } }
这样做的好处是,在我显式调用new运算符之前,不会实例化class2。
-
然后使用引用而不是指针:
class class2 { public class2(args) { ... } } class class1 { protected class2& class2_inst; public class1(args) { class2_inst = new class2(args); ... } }
我希望class2_inst
的生存时间与class1
的生存时间相匹配。让class2_inst
居住在class1
之外并不有趣。所以引用可能是要走的路。
在这三种方法中,这是每个人的首选方法,为什么?
解决方法
您的示例有些倒退。我想你的意思是这样:
class class2 {
public:
class2(args) {
...
}
};
class class1 {
protected:
class2 class2_inst;
public:
class1(args) : class2_inst(args) {
...
}
};
class class2 {
public:
class2(args) {
...
}
};
class class1 {
protected:
class2* class2_inst;
public:
class1(args) {
class2_inst = new class2(args);
...
}
};
class class2 {
public:
class2(args) {
...
}
};
class class1 {
protected:
class2& class2_inst;
public:
class1(args) {
class2_inst = new class2(args);
...
}
};
现在,这样说:
-
示例1可以很好地满足您的需求,并且是首选的处理方式:“ 我希望
class2_inst
的生存时间与class1
的生存时间相匹配。让class2_inst
居住在class1
之外不会有什么好笑的。 -构造它,然后将一个匿名class2_inst(args)
对象复制到其中。参见Constructors and member initializer lists。 -
示例2也可以使用,但要使其正确运行 ,您需要向
class2_inst
添加析构函数,以class2
添加新的{{ 1}}对象,并且还需要向class1
添加复制/移动构造函数和复制/移动赋值运算符,以根据Rule of 3/5/0正确地复制/移动delete
对象。class2
您将在示例1中免费获得所有这些功能,因为编译器将自动为您生成这些额外的方法。是的,在某些情况下,为成员使用指针更有意义,但此示例不是其中之一。
-
示例3完全无效。您不能将对象指针分配给对象引用。为何您会认为“ 引用可能是一种方法”?在这种情况下,它们不是。
因此,简而言之,您应该尽可能使用值语义学,但是在需要时使用 pointer / reference语义。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。