昨天,我试图编写一个基本渲染器,渲染器在数据加载到着色器时控制渲染器,而渲染对象不知道所使用的着色器.作为一个顽固的人(而不是睡眠不足),我花了几个小时试图将函数指针发送到渲染器,保存,然后在适当的时间运行.直到后来我意识到我想要构建的是一个消息系统.它让我想知道,是否可以直接保存带参数的函数指针,以便稍后在c ++中运行.
我最初的想法看起来像这样:
//set up libraries and variables
Renderer renderer();
renderable obj();
mat4 viewMatrix();
// renderer returns and object id
int objID = renderer.loadObj(obj)
int main()
{
//do stuff
while(running)
{
//do stuff
renderer.pushInstruction(//some instruction);
renderer.render();
}
}
// functionPtr.h
#include <functional>
class storableFunction
{
public:
virtual ~storableFunction = 0;
virtual void call() = 0;
};
template<class type>
class functionPtr : public storableFunction
{
std::function<type> func;
public:
functionPtr(std::function<type> func)
: func(func) {}
void call() { func(); }
}; …Run Code Online (Sandbox Code Playgroud) 最近,我一直在抽象和清理我的一个项目,以便为新功能做好准备。当我意识到我想将指向图形上下文和窗口的指针作为抽象类进行管理时,我遇到了一个设计问题。我已经搜索了答案,但还没有找到任何令人满意的东西。我有一种情况,我正在创建一个扩展窗口类和图形上下文类的窗口,就像这样......
class base_a
{
// base_a virtual methods
};
class base_b
{
// base_b virtual methods
};
class derived : public base_a, public base_b
{
//other methods
};
int main ()
{
derived* d = new derived();
// This is what I want to do
std::shared_ptr<base_a> ptr1 (d);
std::shared_ptr<base_b> ptr2 (d);
}
Run Code Online (Sandbox Code Playgroud)
虽然这在对象的生命周期中或多或少是有效的,但在销毁时它会成为一个问题,因为根据销毁的顺序,您可能会删除空内存。拥有指向两者的指针很有用,因为我需要访问虚函数,并且如果可能的话,我希望保持图形上下文和窗口解耦。有没有办法做到这一点?
编辑:改变unique_ptr以shared_ptr作为前者是不正确的