2008-11-12 10 views
0

저는 lib와 데모 프로젝트를 썼습니다. 이 프로젝트는 내가 사용하는 lib의 버전을 신경 쓰지 않습니다 (sdl, directx 또는 gfx 백엔드와 같은 것을 사용할 수 있습니다). 나는 지금 삭제 또는 가상 삭제 하시겠습니까?

Obj *obj = libname_newDevice(); 

할 객체를 얻으려면 내가 삭제 사용해야 아니면 obj->deleteMe();해야합니까? 나는 정확하게 새로운 일을하지 않기 때문에 물어 본다. 삭제를해서는 안된다.

나는 Obj 인터페이스를 사용하여 클래스를 반환하는 obj->create(theType);을 가지고 있습니다. 내 진짜 질문은 libname_deleteDevice();이 필요합니까, 아니면 인터페이스에 deleteMe가 있기 때문에 obj->deleteMe()입니다.

답변

2

나는 한 걸음 더 나아갈 것이다.
팩토리 함수를 사용하여 생성하는 경우 팩토리 함수를 사용하여 파손하는 것이 논리적 일 수 있습니다. 이것 이외에도 모든 것을 멋지게 꾸미고 안전한 물건으로 포장하십시오.

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. 
11

당신이 libname_newDevice() 내에서 생성을 추상화하고 있기 때문에 좋은 방법이 아닌 것으로 믿기 때문에 libname_destroyDevice (obj)와 같은 것을 사용하여 파괴해야합니다.

+0

예, 대칭성이 좋습니다. 그런 다음이 두 함수가 생성자/소멸자에 의해 호출되는 객체 안에 모든 것을 래핑해야합니다. –

4

질문을 명확히하십시오. 나에게 완전히 불분명하다.

  • 왜 그래픽 백엔드에 대해 이야기합니까? 질문과 관련이 있습니까?
  • 라이브러리 디자인 방법이나 사용 방법을 묻는 질문이 있으십니까?

개체를 만들려면 개체 팩토리가 있어야합니다. 이것이 libname_newDevice()의 역할이라고 가정합니다.

라이브러리는 개체를 삭제하는 방법 (예 : obj->DeleteMe() 또는 libname_Delete(obj))도 제공해야합니다.

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

+0

그래픽 관련이 없다고 생각합니다. 특히 나는 내가 libname_Delete()를 수행해야하는지 또는 obj-> DeleteMe()를 수행해야하는지 알고 싶습니다. 나는 또한 obj-> create (theType); –

+0

lib가 만든 개체를 삭제하는 것이 더 안전합니다 (Windows에서). 그러나 이유에 대한 당신의 추론은 결함이 있습니다. –

0

Obj :: deleteMe()를 구현하고 싶지는 않을 것입니다. 다음과 같이해야합니다 :

delete this; 

this-> deleteMe() 내부에있는 동안. Jaywalker의 제안에 따라 destroy 함수가 Obj *를 매개 변수로 사용하도록 만듭니다.

+0

"삭제하십시오;" 사람이 피부를 기어 다니게 만들지 만 반드시 나쁜 것은 아닙니다. 자신의 참조 카운팅을 구현하는 객체는 항상이를 수행해야합니다.예를 들어, 모든 "내 첫 번째 COM 구현"에서 Release()를 참조하십시오. – RobH

1

나는 최상의 방법은 RAII을 존중하고 래퍼 객체를 참조 할 수 있다고 생각합니다. 사용자 정의 할당 해제로 shared_ptr을 사용할 수도 있습니다.

관련 문제