문제

나는 LIB와 데모 프로젝트를 작성하고 있습니다. 이 프로젝트는 내가 사용하는 LIB 버전을 신경 쓰지 않습니다 (SDL, DirectX 또는 GFX 백엔드로 좋아하는 것을 사용할 수 있습니다). 내가하는 물건을 얻기 위해

Obj *obj = libname_newDevice();

이제 삭제를 사용해야합니까? obj->deleteMe();? 나는 정확히 새로운 일을하지 않기 때문에 묻습니다. 그래서 삭제를하지 말아야합니까?

나는 가지고있다 obj->create(theType); OBJ 인터페이스로 클래스를 반환합니다. 내 진짜 질문은 내가 필요합니까? libname_deleteDevice(); 또는입니다 obj->deleteMe() 인터페이스에 삭제가 있기 때문에 괜찮습니까?

도움이 되었습니까?

해결책

한 걸음 더 나아갈 것입니다.
공장 기능을 사용하여 생성하는 경우 공장 기능을 사용하여 파괴하는 것이 논리적 일 수 있습니다. 이 외에도 객체에 멋지고 엑스 션 안전 랩을 만들 수 있습니다.

class ObjWrap
{
    public:
        ObjWrap()
            :obj(libname_newDevice())
        {}
        ~ObjWrap()
        {    libname_deleteDevice(obj);}
    private:
        ObjWrap(ObjWrap const&);        // Dont copy
        void operator=(ObjWrap const&); // Dont copy
        Obj* obj;
}; // If you want to copy then you need to extra work on ref counting
   // This may need some form of smart pointer.

다른 팁

당신은 내부의 창조물을 추상화하고 있기 때문에 libname_newDevice() (내가 말해야 할 것은 좋은 접근법이 아닙니다), 당신은 같은 것을 사용하여 파괴해야합니다. libname_destroyDevice (obj).

그리고 Martin의 의견에서 알 수 있듯이, 사용자 정의 클래스의 생성자와 소멸자에 넣는 것이 가장 좋습니다. 스택에서만 만들면 컴파일러가 나머지를 처리합니다.

귀하의 질문을 명확히 해주세요. 나에게 완전히 불분명합니다.

  • 그래픽 백엔드에 대해 말하는 이유는 무엇입니까? 질문과 관련이 있습니까?
  • 도서관을 어떻게 설계 해야하는지 또는 어떻게 사용해야하는지 묻고 있습니까?

객체를 만들기 위해 객체 공장을 갖는 것이 좋습니다. 나는 이것이 역할이라고 생각합니다 libname_newDevice().

도서관은 또한 객체를 삭제하는 방법을 제공해야합니다 (예 : obj->DeleteMe() 또는 libname_Delete(obj) ).

C ++에 의존하지 마십시오 delete: 발신자와 라이브러리는 다른 버전의 컴파일러로 컴파일되었을 수 있으며, 이는 메모리 및 리소스 할당과 관련하여 다른 작업을 수행 할 수 있습니다. 따라서 LIB가 생성 된 개체를 삭제하면 더 안전합니다.

가장 좋은 방법은 존중하는 것입니다 raii 참조 카운팅 래퍼 객체가 있습니다 (사용할 수도 있습니다. shared_ptr 맞춤 거래자와 함께).

당신은 분명히 obj :: deleteme ()를 구현하고 싶지 않습니다. 다음과 같은 작업을 수행해야합니다.

delete this;

당신이 여전히이-> deleteme () 안에있는 동안. Jaywalker의 제안을 따르고 파괴 함수가 OBJ*를 매개 변수로 취하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top