我建议使用private friend方法,该方法实现了构造函数的应用逻辑,并由各种构造函数调用。这里有一个例子:
假设我们有一个名为StreamArrayReader的类,它带有一些私有字段:
private:
istream * in;
// More private fields
我们想定义两个构造函数:
public:
StreamArrayReader(istream * in_stream);
StreamArrayReader(char * filepath);
// More constructors...
其中第二个简单地使用了第一个(当然,我们不想复制前者的实现)。理想情况下,人们会做如下事情:
StreamArrayReader::StreamArrayReader(istream * in_stream){
// Implementation
}
StreamArrayReader::StreamArrayReader(char * filepath) {
ifstream instream;
instream.open(filepath);
StreamArrayReader(&instream);
instream.close();
}
然而,这在c++中是不允许的。因此,我们可以定义一个私有友方法,如下所示,它实现了第一个构造函数应该做的事情:
private:
friend void init_stream_array_reader(StreamArrayReader *o, istream * is);
现在这个方法(因为它是一个朋友)可以访问o的私有字段。然后,第一个构造函数变成:
StreamArrayReader::StreamArrayReader(istream * is) {
init_stream_array_reader(this, is);
}
注意,这不会为新创建的副本创建多个副本。第二个是:
StreamArrayReader::StreamArrayReader(char * filepath) {
ifstream instream;
instream.open(filepath);
init_stream_array_reader(this, &instream);
instream.close();
}
也就是说,不是一个构造函数调用另一个构造函数,而是两个构造函数都调用一个私有友元!