我不知道有什么模式可以处理这个特定问题。这是一个棘手的设计问题,对于像 C++ 这样的语言来说有些独特。另一个问题是,这个问题的答案与您的个人(或公司)编码风格密切相关。
我会为这些成员使用指针,当需要构造它们时,同时分配它们。您可以对这些使用 auto_ptr,并检查 NULL 以查看它们是否已初始化。(我认为指针是 C/C++/Java 中内置的“可选”类型,在其他语言中 NULL 不是有效指针)。
作为风格问题的一个问题是,您可能依赖于您的构造函数来做太多的工作。当我编写面向对象的代码时,我让构造函数做足够的工作来使对象处于一致的状态。例如,如果我有一个Image
类并且我想从一个文件中读取,我可以这样做:
image = new Image("unicorn.jpeg"); /* I'm not fond of this style */
或者,我可以这样做:
image = new Image(); /* I like this better */
image->read("unicorn.jpeg");
如果构造函数中有很多代码,那么很难解释 C++ 程序是如何工作的,尤其是当你问这个问题时,“如果构造函数失败会发生什么?” 这是将代码移出构造函数的主要好处。
我还有更多话要说,但我不知道你想对延迟施工做什么。
编辑:我记得有一种(有点反常的)方法可以在任意时间调用对象的构造函数。这是一个例子:
class Counter {
public:
Counter(int &cref) : c(cref) { }
void incr(int x) { c += x; }
private:
int &c;
};
void dontTryThisAtHome() {
int i = 0, j = 0;
Counter c(i); // Call constructor first time on c
c.incr(5); // now i = 5
new(&c) Counter(j); // Call the constructor AGAIN on c
c.incr(3); // now j = 3
}
请注意,做这种鲁莽的事情可能会引起其他程序员的鄙视,除非你有充分的理由使用这种技术。这也不会延迟构造函数,只是让您稍后再次调用它。