![]() |
1
4
关键问题是是否应该区分完全填充的对象和未完全填充的对象
在类型级别
. 如果你决定不做区分,那就用
参数组类型
如果在类型级别上确实区分了完全填充的对象和未完全填充的对象,则可以强制要求向函数传递完整的对象。为此,我建议创建相应的类型
“部分对象”类型
如果你不需要
做
在完全填充对象之前使用该对象的任何内容(可能不包括诸如获取字段值之类的琐碎内容)。如果你不得不有时治疗一个人口不全的
虽然这里的继承看起来是“背对背”,但这样做意味着
原来我有
|
![]() |
2
1
我一定是错过了什么-我一直都在做这种事。在任何情况下,类都有很大和/或不需要的对象是很常见的。所以动态地创建它们!
我不认为需要比这更新奇的东西,除了makebig()应该是const(可能是inline),而且大指针应该是可变的。当然,a必须能够构造big,这在其他情况下可能意味着缓存包含类的构造函数参数。你还需要决定一个复制/分配策略-我可能会禁止这两种类型的类。 |
![]() |
3
0
我不知道有什么模式可以处理这个具体问题。这是一个棘手的设计问题,一个有点独特的语言,如C++。另一个问题是,这个问题的答案与您的个人(或公司)编码风格密切相关。 我将为这些成员使用指针,当需要构造它们时,同时分配它们。您可以使用auto-ptr来处理这些文件,并检查是否初始化了这些文件。(我认为指针是C/C++/Java中内置的“可选”类型,还有其他语言,NULL不是有效指针)。
风格方面的一个问题是,您可能依赖于构造函数来完成太多的工作。当我编写oo代码时,我让构造器做的工作足以使对象处于一致状态。例如,如果我有一个
或者,我可以这样做:
如果构造函数中有很多代码,就很难解释C++程序是如何工作的,尤其是当你问这个问题时,“如果构造函数失败了,会发生什么?”这是将代码移出构造函数的主要好处。 我有更多的话要说,但我不知道你想怎么处理延误的建设。 编辑:我记得有一种(有些反常的)方法可以在任意时间调用对象的构造函数。下面是一个例子:
注意,如果你没有充分的理由使用这种技术,那么这样鲁莽的行为可能会让你受到其他程序员的蔑视。这也不会延迟构造函数,只是让您稍后再调用它。 |
![]() |
4
0
对于某些用例,使用boost.optional看起来是一个很好的解决方案。我没有玩太多,所以我不能评论太多。在处理此类功能时,我要记住的一件事是,我是否可以使用重载构造函数,而不是默认和复制构造函数。 当我需要这样的功能时,我只需要使用一个指向必需字段类型的指针,如下所示:
接下来,我将通过以下方法访问字段,而不是使用指针:
我省略了const访问语义 |
![]() |
5
0
我所知道的最简单的方法与dietrich epp建议的技术相似,只是它允许你真正地延迟对象的构建,直到你选择的某个时刻。 基本上:使用malloc而不是new保留对象(从而绕过构造函数),然后在 真正地 希望通过Placement New构造对象。 例子:
就我个人而言,我唯一使用过这种语法的时候,我必须使用C++ C++对象的一个定制的基于C的分配器。正如dietrich建议的那样,您应该质疑是否真的必须延迟构造函数调用。这个 基础 构造函数应该执行最小值以使对象进入可用状态,而其他重载构造函数可能根据需要执行更多的工作。 |
![]() |
6
0
我不知道这有没有正式的模式。在我见过的地方,我们称之为“懒惰”、“需求”或“随需应变”。 |
![]() |
KiraHoneybee · 具有构造函数参数的模板化类 2 年前 |
![]() |
nick2225 · 隐式调用复制构造函数? 2 年前 |
![]() |
nohaga · 为什么在本例中p3需要默认构造函数? 2 年前 |
![]() |
Aadil Hoda · 为什么类类型的成员需要初始化? 2 年前 |
![]() |
EloiGG · 具有任意类型的变量的可数的C++函数 2 年前 |