在使用 3D/2D 绘图库时,我经常发现自己将指向渲染窗口的指针传递给每个处理将自身绘制到 Canvas 上的可绘制对象类。
但是,每次我这样做时,我都担心通过将指针传递给渲染窗口,对象本身可能会更改或破坏渲染窗口本身 - 这对我来说似乎不安全。
但是,我不想让渲染窗口不可变,因为通过将对象绘制到它上面,我大概会更改它的数据(这是一个假设,我无权访问实现)。
我的问题是:将一个对象(例如窗口句柄)的指针/引用传递给另一个需要调用它的成员(可能会更改它的成员)的对象的最佳方式是什么?底层数据结构),但不会让它被传递给它的对象破坏。
我觉得我上面的问题术语可能是矛盾的,如果是这种情况,请解释为什么我的设计模式是错误的,以及我可以使用的更好的这种交互模式。
我不是在谈论任何特定的库,但在我下面的代码示例中,我将引用 SFML
显然,在我的示例中为了视觉清晰度我使用原始指针,我通常使用 unique_ptr 或 shared_ptr。
代码示例:
namespace sf {
class RenderWindow;
class Shape;
}
class DrawableObject;
int main() {
sf::RenderWindow* window = new sf::RenderWindow(x,y,z,bla,bla,bla);
DrawableObject object = DrawableObject(window);
object.draw();
delete window;
}
class DrawableObject {
public:
// So here is where my issue exists, by passing a pointer to the window, I could in theory corrupt it and change it's settings from within this class...
DrawableObject(sf::RenderWindow* _window)
:
windowReference(_window),
renderShape(sf::Shape(x,y,z,bla,bla,bla))
{
}
void draw() {
windowReference->draw(renderShape);
}
private:
sf::RenderWindow* windowReference;
sf::Shape renderShape;
};
提前致谢!
最佳答案
传递一个指向其他东西的指针。例如,将指针传递给派生自(例如 IDrawSurface
)的可安全使用的接口(interface) RenderWindow
,或定义可安全使用的 proxy你可以通过:
class SafeRenderWindowPtr {
public: /* Methods: */
SafeRenderWindowPtr(std::shared_ptr<RenderWindow> window) noexcept
: m_window(std::move(window))
{}
void draw(Shape &);
private: /* Fields: */
std::shared_ptr<RenderWindow> m_window;
}; /* class SafeRenderWindowPtr */
// In some cpp file:
void SafeRenderWindowPtr::draw(Shape & s) { return m_window->draw(stuff); }
关于c++ - 传递一个 const 指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41976785/