通过复制将opengl对象包装到c ++类中

Ben*_*Ben 1 c++ opengl copy-constructor

这通常是怎么做的?

例如,您可能有一个纹理类.这当然会包含GLuint id,也可能包含宽度和高度等其他字段.当出于某种原因需要复制对象时,需要用户定义的复制构造函数.

现在,在opengl纹理的情况下,可以将其复制到另一个纹理对象.但是着色器程序或FBO呢?这些不容易复制.人们通常如何做到这一点?它们应该被引用计数吗?是否应禁用所有对象的复制?是否应对所有无法复制的对象禁用复制?

最好的方法是什么?提前感谢您的任何答案.

hei*_*chj 5

对于类似纹理的东西,实际上可能有一点要复制它,但对于着色器对象则更少(根据我的经验).即使对于复制有意义的对象,您也不希望经常这样做,因此您希望使其非常明确.

要么你使用你的包装类by-value(所以它就像你的OpenGL实体的句柄),它在内部使用引用计数,或者你认为你的包装类实例拥有OpenGL实体,你在你的包装类上使用引用计数本身(例如使用std :: shared_ptr).

在后一种情况下,您可以仅对那些有意义的实体实现复制构造函数.但是,为了避免无意使用,我通常会在实体上使用私有构造函数和公共静态工厂函数,该函数将新实例作为智能指针返回,因此它不会被-value错误地使用.在这种情况下,拥有一个明确的"复制/克隆"成员函数(更容易使用并允许多态)也更有意义.

在前一种情况下,复制构造函数仅增加引用计数,因此无论如何您都需要添加一些显式成员进行复制.

顺便提一下,我通常选择后一种选择...我习惯于通过智能指针传递资源密集型对象,我没有看到在自定义句柄中重新实现其功能的重点.