我建议使用一种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();
}
也就是说,不是让一个构造函数调用另一个构造函数,而是调用一个私人朋友!