使用3D / 2D绘图库时,我经常发现自己将一个指向渲染窗口的指针传递给每个可绘制对象类,这些对象类将自己绘制到画布上。
但是,每次我这样做时,我都担心通过将指针传递给渲染窗口,对象本身可能会改变或破坏渲染窗口本身 - 这对我来说似乎不安全。
但是,我不想让渲染窗口不可变,因为通过将对象绘制到它上面我可能会改变它的数据(这是一个假设,我无法访问实施)。
我的问题是:将对象(如窗口句柄)的指针/引用传递给另一个需要调用它的成员(可能是其成员)的最佳方法是什么?对它的底层数据结构进行更改,但不要让它被传递给它的对象所破坏。
我认为我的上述问题术语可能是矛盾的,如果是这种情况,请解释为什么我的设计模式是错误的,以及我可以使用的这种交互的更好模式。
我不是特别谈论任何库,但在下面的代码示例中,我将引用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;
};
提前致谢!
答案 0 :(得分:1)
将指针传递给其他东西。例如,将指针传递给安全使用的界面RenderWindow
派生自(例如IDrawSurface
),或者定义一个可以通过的安全使用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); }
答案 1 :(得分:1)
如果将指针传递给const对象(例如const sf::RenderWindow* _window
),则只能调用声明为const的sf::RenderWindow
方法。
如果要调用非const方法,则没有(明确的)方法来存储指向const对象的指针。
除了正确使用它之外,没有办法保护自己免受对象损坏。