这通常是怎么做的?
例如,您可能有一个纹理类。这当然会包含GLuint id,也可能包含宽度和高度等其他字段。当出于某种原因需要复制对象时,需要用户定义的复制构造函数。
现在,在opengl纹理的情况下,可以将其复制到另一个纹理对象。但是着色器程序或FBO呢?这些不容易复制。人们通常如何做到这一点?它们应该被引用计数吗?是否应禁用所有对象的复制?是否应对所有无法复制的对象禁用复制?
最好的方法是什么?提前感谢您的任何答案。
答案 0 :(得分:5)
对于像纹理这样的东西,实际上可能有一点要复制它,但对于着色器对象则更少(根据我的经验)。即使对于复制有意义的对象,您也不希望经常这样做,因此您希望将其变得非常明确。
要么使用你的包装类by-value(所以它类似于你的OpenGL实体的句柄)并且它在内部使用引用计数,或者你认为你的包装类实例拥有OpenGL实体并且你使用引用计数你的包装类本身(例如使用std :: shared_ptr)。
在后一种情况下,您只能对那些有意义的实体实现一个复制构造函数。但是,为了避免无意使用,我通常会在实体上使用私有构造函数和公共静态工厂函数,该函数将新实例作为智能指针返回,因此它不会被-value错误地使用。在这种情况下,拥有一个明确的“复制/克隆”成员函数(更容易使用并允许多态)也更有意义。
在前一种情况下,复制构造函数只会增加引用计数,因此无论如何您都需要添加一些显式成员进行复制。
顺便说一句,我通常选择后一种方式......我习惯于通过智能指针传递资源密集型对象,而且在自定义句柄中重新实现它们的功能并没有多大意义。