需要建议以在 c++ 中找到 WrapperInterface 的正确实现(三法则)

Need advise for finding correct Implementation for WrapperInterface in c++ (rule of three)

提问人:kaiser 提问时间:2/21/2016 更新时间:2/21/2016 访问量:41

问:

我试图为接口找到一个工作模式。

关于我正在做的事情的一些信息。我正在 dx11 中实现渲染引擎。我的目标是提供一个简单且高度接口的引擎,客户不必具备任何 dx11 或高级渲染技术的知识。

我有我的引擎,该引擎提供了设置和创建任何对象、地形、太阳、照明、水、地平线和和的功能。

现在我来回答我的问题。我所谓的引擎 MeshController 提供了以下 3 种方法(代码简化):

//check if that description already exists (if not create it) and return that id
UINT addDesc(const MESH_ENTITY_DESC& desc);

//create an instance of the given object
MeshEntity* createInstance(const UINT descID);

//destroy the instance
void destroyInstance(MeshEntity* entity);

为了避免客户端处理指针,我尝试将其打包到一个包装类中,该类将进行nullptr检查,检查实体是否已被销毁或已创建等等。

包装纸:

class MeshObject
{
    private:
    UINT g_Desc;
    MeshEntity* g_Entity;
}

现在我希望对象始终处于有效状态。如果实例在丢失包装器对象之前没有被销毁,它将造成内存泄漏(不是真的,但我的控制器会渲染它直到场景关闭,或者会阻止实例插槽,总而言之,客户端将失去对实例的控制)。所以我的第一个想法是这样的:

//constructor
MeshObject(const MESH_ENTITY_DESC& desc)
{
     g_Desc = Controller::addDesc(desc);
     g_Entity = Controller::createInstance(g_Desc);
}

//copy constructor
MeshObject(const MeshObject& mo)
{
    g_Desc = mo.g_Desc;   //no need of adding desc, already exists
    g_Entity = g_Entity;  // no need of recreation? or should i also create a copy of the rendered object in the controller, so duplicate it?
}

MeshObject& operator=(const MeshObject& mo)
{
    g_Desc = mo.g_Desc;   //no need of adding desc, already exists
    g_Entity = g_Entity;  // definitly no need of recreation
}

~MeshObject()
{
    Controller::destroyInstance(g_Entity);
}

由于三法则,我需要副本和赋值运算符。但问题来了。createInstance 和 destroyInstance 方法有很多开销,因为添加/删除场景,可能会重新创建渲染缓冲区......

所以现在我试图找到任何方法来防止对象被破坏,如果它之前被复制过,或者是否有有效的引用(指针)指向它。这不是典型的动态内存分配,而是控制器中的某种分配。

客户端的典型用例:

std::vector<MeshObject> moVector;
for(int i = 0; i < blabla; i++)
{
    MeshObject mo(someDescription); // created object in controller

    //do lot of init stuff, like position, rotation, ...

    mo.pushback(mo); // here mo will be copied, try to avoid double creation
} // here mo will lose scope and will be destroyed, stop destroying because there is a valid wrapper object

这是一些激励的图片^^Image of my rendering engine

感谢您的帮助!

C++ 设计模式 DirectX-11 三法则

评论

1赞 Brandon 2/22/2016
shared_ptr的参考计数模式可能会有所帮助。你真的需要资源/网格的深度副本吗?
0赞 kaiser 2/22/2016
@Brandon:谢谢你的回答。shared_ptr的功能正是我所需要的。但是shared_ptr被销毁,它会调用“删除指针?!?我需要调用控制器的destroyInstance函数吗?是否可以设置自定义析构函数?
0赞 Brandon 2/22/2016
stackoverflow.com/questions/12340810/......和/或 stackoverflow.com/questions/13633737/...
0赞 kaiser 2/22/2016
非常感谢,这解决了我所有的问题。当您将其作为答案发布时,我会接受它。

答: 暂无答案