다른 클래스를 참조하는 클래스가 있습니다. 이 참조를 점진적으로 추가 할 수 있기를 원합니다 (즉, 동시에 생성자에서 모두가 아닌). 클래스에서 이러한 참조를 기본으로하는 객체를 삭제하는 기능을 허용하지 않으려합니다. 또한 NULL을 테스트합니다. 이 참조에 대해서는 특정 참조가 추가되지 않았다는 것을 알고 있습니다. 이러한 요구 사항을 달성하기위한 좋은 설계는 무엇입니까?클래스에서 여러 참조를 가장 잘 처리하는 방법
답변
나는 boost::shared_ptr
을 사용해야한다는 다른 의견에 동의합니다.
그러나 참조 할 개체의 수명을 부분 제어하는 클래스를 원하지 않으면 참조를 보유하기 위해 boost::weak_ptr
을 사용하는 것이 좋습니다. 그런 다음 참조를 유지하려면 참조 번호를 shared_ptr
으로 바꾸십시오. 이렇게하면 참조 된 객체가 클래스보다 먼저 삭제되고 객체를 사용하기 전에 객체가 삭제되었는지 항상 알 수 있습니다.
Service Locator을 구축하려는 것 같습니다.
사이드 코멘트로 : it is going to make testing really, really painful if you ever want to do it 때문에 개인적으로하지 않는 것이 좋습니다. 생성자 삽입 (당신이 피하려고하는 것)은 테스트를 훨씬 쉽게합니다.
refcounted 클래스를 사용하면 기본 클래스가 삭제 될 때까지 참조가 관리되지 않아야합니다.
당신은 대부분 boost::shared_ptr
을 찾고 있습니다.
boost :; shared_pointer를 사용하는 모든 권장 사항에도 불구하고 클래스에 소유권 의미가없는 것처럼 보이기 때문에 게시물에서 적절하지 않을 수 있습니다. 보통의 C++ 포인터는 여기에서 잘 동작합니다.
스마트 포인터는 어떤 형태로든 기본 벙어리 포인터에 대한 액세스를 제공해야하므로 스마트 포인터를 통한 삭제를 방지하기는 어렵지만 물론 항상 삭제할 수 있습니다. 일부 문제의 경우 기술 솔루션이 없으며이 경우 코드 검토는 포함 된 포인터를 사용하여 의미 론적 오류를 감지하는 가장 좋은 방법입니다.
참조하려는 개체는 다음과 같이 파생 될 수 있습니다. 그러면 삭제할 수 없습니다. NonDeletable
클래스 T 클래스 : 공공 T는 { 개인 : 무효 연산자 (무효 *)를 삭제; };
- 1. 여러 스크롤링 열을 처리하는 가장 좋은 방법
- 2. 안드로이드에 대한 제스처 동작을 가장 잘 처리하는 방법 ListActivity
- 3. 반복 일정 이벤트 예외를 가장 잘 처리하는 방법
- 4. 파일을 가장 잘 조직하는 방법
- 5. 여러 HTMLPurifier 구성을 효율적으로 처리하는 방법
- 6. 스칼라에서 XML 문자 참조를 처리하는 방법?
- 7. Android에서 이미지를 더 잘 처리하는 방법
- 8. 상대 경로를 더 잘 처리하는 방법
- 9. 여러 개의 NSPopUpButton 인스턴스간에 NSMenu를 가장 잘 공유하는 방법
- 10. PHP : 두 서버간에 가장 잘 통신하는 방법
- 11. 아마존 SimpleDB에이 구조체를 가장 잘 매핑하는 방법
- 12. 오류를 처리하는 가장 좋은 방법
- 13. 인덱스 페이지에서 가능한 여러 쿼리 조건을 처리하는 가장 좋은 방법
- 14. 여러 파일을 처리하는 가장 완고한 방법은 무엇입니까
- 15. 여러 작업을 처리하는 가장 좋은 방법은 무엇입니까?
- 16. 여러 CCSprites를 처리하는 가장 효율적인 방법은 무엇입니까?
- 17. 스케줄링 앱의 시간 산술을 가장 잘 처리하는 방법은 무엇입니까?
- 18. 단일보기에서 세로 모드와 가로 모드를 가장 잘 처리하는 방법은 무엇입니까?
- 19. CMake로 데이터 파일을 가장 잘 처리하는 방법은 무엇입니까?
- 20. Ruby에서 HTTP 응답을 가장 잘 처리하는 방법은 무엇입니까?
- 21. Delphi : 여러 파일을 처리하는 방법?
- 22. Asp.NET에서 여러 요청을 처리하는 방법
- 23. 여러 대의 대리인을 처리하는 방법
- 24. 여러 줄의 탭을 잘 처리하는 Jquery 탭 컨트롤이 있습니까?
- 25. NetBeans에서 Eclipse로 마이그레이션 할 때 org.netbeans. * 참조를 처리하는 방법
- 26. Carrierwave : 동일한 유형의 여러 업로드를 처리하는 방법
- 27. SQL 쿼리를 잘 수행하는 가장 좋은 방법
- 28. 웹 크롤러를 가장 잘 개발하는 방법
- 29. 생성 된 코드를 가장 잘 통합하는 방법
- 30. LinqToSql에서 개체 관계를 가장 잘 할당하는 방법
좀 더 구체적으로 알려주시겠습니까? –
포인터를 설명하는 것 같습니다. boost :: shared_ptr (및 다른 스마트 포인터 유형)을 고려하십시오. 하지만 "개체 삭제 기능을 허용하지 않음"이라는 의미가 확실하지 않습니다. 참조가있는 경우 컴파일러에서 "&blah; 삭제"를 입력하는 것을 멈출 수 없습니다. –
사실. 포인터를 사용하지 않는 이유는 무엇입니까? – aib