我有一个名为messenger
的类,它依赖于一个printer
实例。 printer
是一个多态基类,实际对象在构造函数中传递给messenger
。
对于非多态对象,我只需执行以下操作:
class messenger {
public:
messenger(printer const& pp) : pp(pp) { }
void signal(std::string const& msg) {
pp.write(msg);
}
private:
printer pp;
};
但是当printer
是一个多态基类时,这种方法就不再适用了(切片)。
考虑到以下情况,什么是使其正常工作的最佳方式:
- 我不想在构造函数中传递指针。
printer
类不应该需要一个虚拟的clone
方法(=需要依赖于复制构造)。
我不想在构造函数中传递指针,因为API的其他部分使用实际对象而不是指针,并且在这里使用指针作为参数会让人混淆/不一致。
在C++0x下,我可以使用unique_ptr
和模板构造函数:
struct printer {
virtual void write(std::string const&) const = 0;
virtual ~printer() { } // Not actually necessary …
};
struct console_printer : public printer {
void write(std::string const& msg) const {
std::cout << msg << std::endl;
}
};
class messenger {
public:
template <typename TPrinter>
messenger(TPrinter const& pp) : pp(new TPrinter(pp)) { }
void signal(std::string const& msg) {
pp->write(msg);
}
private:
std::unique_ptr<printer> pp;
};
int main() {
messenger m((console_printer())); // Extra parens to prevent MVP.
m.signal("Hello");
}
这是最好的替代方案吗?如果是,那在0x之前什么是最好的方法?并且有没有办法在构造函数中摆脱完全不必要的复制?不幸的是,在这里移动临时对象是行不通的(对吗?)。
unique_ptr
在实际使用中表现得就像指针一样,唯一的区别在于生命周期管理。 - Jan Hudec