2013-04-07 1 views
1

저는 (OpenGL 그래픽 엔진 인) C++ (C++ 11) 라이브러리를 가지고 있습니다.이벤트 수신기 등록에 사용할 저장소 포인터

제 질문은 이벤트 수신기를 등록하기위한 좋은 프로그래밍 기술을 중심으로 이루어졌습니다.

그래서 같은 수준의 관계를 가지고

Program --has ->SceneManager --has ->ShaderManager --has -> * Shader

Shader 클래스는 다른 객체를 등록 할 수 있습니다 자체는 ShaderBindListener으로, 이는 쉐이더가 호출 될 때마다 bind() 메서드가 호출 됨으로써 모든 청취자에게 알린다는 것을 의미합니다.

ShaderManager 클래스는 외부 라이브러리가 액세스 할 수 있고 새로운 Shader 개체를 만들 수있는 클래스입니다.

는 지금, 나는 각 Shader 객체가 Shader가 결합 될 때 Program 객체가 통지와 GPU에 Shader에 등, 행렬 데이터를 전달할 수 있도록하는 ShaderBindListenerProgram 객체를 갖고 싶어.

내 초기 해결책은 에 대한 포인터를 전달하는 SceneManager에 대한 포인터를 Program 개체가 자신에게 전달하도록하는 것이 었습니다. 새로운 Shader이 생성 될 때마다 ShaderManagerProgram을 수신기로 추가합니다.

이것은 잘 작동하지만 디자인에있어 약간 잘못된 것 같습니다.

어쩌면 나는 현학적 일뿐입니다. 그러나 이것은 여러분에게 좋은 디자인처럼 보입니까?

답변

2

몇 가지 옵션이 있습니다. 장단점은 종종 논쟁의 여지가 있으며 스타일에 따라 다릅니다. 프로세스가 오직 Program의 인스턴스가됩니다 싱글

, 당신은 singletonProgram을 만들 수 있습니다. 이렇게하면 포인터를 전달할 필요가 없습니다.

중간 오브젝트

대신 통해 this 포인터를 전달하는, 당신은 Program을 캡슐화하고 그것의 이벤트 처리를 관리하는 객체를 통과있을 수 있습니다. 그렇게하면 다른 클래스는 Program에 대해 알 필요가 없으며 이벤트 클래스에 대한 인터페이스 만 있으면됩니다.

실제로 Boost을 사용하는 것을 싫어하는 사람은 찾고있는 것이 있습니다 : Signals2 라이브러리.

+0

감사합니다. @anthony. Boost Signals에 대해 들어 본 적이 없으므로 확인해 보겠습니다. 나는 원래 싱글 톤 객체를 사용하고 있었지만, 최근에 그들이 모든 악의 산란에 대해 준비해 왔기 때문에, 나는 그것들을 리팩터링하려고 노력해 왔습니다. – Jarrett

관련 문제