【发布时间】:2017-03-22 20:04:45
【问题描述】:
我正在为 OpenGL 实现一个简单的 GUI,主要是作为我自己的练习。这个想法是有一个 Gui 类,其中每个实例都可以分配给不同的渲染目标(例如后台缓冲区或纹理)。 GUI 元素(小部件)被分配给 Gui 类的一个实例。我想在 GUI 中存储元素是unique_ptr 的典型用例。这是我想出的:
class Element {
public:
Element();
virtual ~Element();
static std::unique_ptr<Element> create_unique();
};
class Gui {
public:
typedef std::unique_ptr<Element> element_ptr;
Gui();
void addElement( element_ptr element );
void addElementRaw( Element* element );
private:
std::list<element_ptr> elements;
};
int main(void) {
Gui gui;
gui.addElementRaw( new Element() ); // 1
gui.addElement( Element::create_unique() ); // 2
gui.addElement( std::unique_ptr<Element>(new Element()) ); // 3
auto el = Element::create_unique();
gui.addElement( std::move(el) ); // 4
}
我不希望 GUI 的潜在用户担心移动指针。但是,我想通过 API 明确说明 GUI 类拥有元素的所有权。
- 传递原始指针:简单用法,但 API 并未明确说明所有权已传递。
- 工厂函数:使用简单,但是对于从Element派生的每个类都需要重新实现该函数。
- 手动创建 unique_ptr:对用户来说很麻烦
- 移动语义:看起来也很麻烦。
我对我的解决方案不满意。我想要的是 (1) 的简单性,同时通过 API 清楚地表明 gui 现在拥有该元素。
【问题讨论】:
-
#3 在 C++1y 中将被简化为
std::make_unique。 -
是的,但是用户仍然需要为涉及到 unique_ptr 的事实而烦恼......但是,毕竟这可能是可取的。
-
我建议快速阅读this GOTW
标签: c++ c++11 smart-pointers