2016-12-21 4 views
1

나는 Widget이라는 클래스를 가지고있다. 이 클래스는 추상 클래스이며 가상 메소드가 있습니다. 객체를 자르지 않으려면 Widgets이 참조 또는 포인터로 저장됩니다. 나는 내부적으로 주어진 위젯을 저장하는 생성자가있는 여러 클래스를 가지고있다. 따라서 Widget은 생성자 외부에서 초기화되어야하며 객체가 생성되기 전에는 삭제 될 수 없으므로 일반적으로 Widget이 동적 메모리를 통해 할당됩니다. 내 질문은이 동적 메모리를 처리하는 방법에 관한 것입니다. 나는 옵션리스트를 컴파일했다. (다른 사람들에게 자유롭게 제안하자.) 가장 관용적 인 것은 어느 것인가?다형성 및 자원 관리에 관한 프로그램 설계

1. 스마트 포인터. 스마트 포인터가 올바른 선택 인 것 같지만 C++ 98을 사용하고 있기 때문에 내 포인터를 써야합니다. 나는 또한 항상 smart_pointer<Widget>을 쓰는 것이 약간 추한 것이라고 생각한다.

2. 저장시 Widgets을 복사하십시오. 또 다른 조치는 원본 대신에 Widget이 전달 된 복사본을 저장하는 것입니다. 이로 인해 개체 조각이 발생할 수 있지만 잘 모르겠습니다. 또한 사용자는 전달 된 Widgets을 저장하는 클래스 자체를 작성하려고 할 수도 있습니다. 너무 복잡하게 만들고 싶지는 않습니다.

3. 사용자가 모든 것을 처리하게하십시오. 아마도 사용자가 Widget이 제 시간에 삭제되었는지 확인하도록 만들 수 있습니다. 이것은 Qt가하는 것 같습니다 (?). 그러나 이는 다시 사용자에게 복잡한 일입니다.

+0

스마트 포인터를 사용합니다. 결함이 있어도'std :: auto_ptr'이 있습니다. 'std :: auto_ptr'가 작업을 수행하지 않는다면 이미 작성한 것을 찾거나 이미 작성한 것을 찾는다. – Galik

+1

그리고'typedef unique_pointer WidgetUPtr; '과 같은 것들을 사용하여 덜 자세하게 입력 할 수 있습니다. – Galik

+0

또 다른 옵션으로'clone' 이디엄이 있습니다. https://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Virtual_Constructor. * 옵션 2 *와 함께 사용하면 오브젝트 조각을 피할 수 있습니다. –

답변

1

나는 개인적으로이 방법 (항상 적용되지 않습니다,하지만 난 그것을 성공적으로 여러 번 사용)과 같은 :

class WidgetOwner 
{ 
    vector<Widget*> m_data; 
public: 
    RegisterWidget(Widget *p) { m_data.push_back(p); } 
    ~WidgetOwner() { for (auto &p : m_data) delete p; } 
}; 

이 간단한 클래스는 단지 포인터를 저장합니다. 이 클래스는 Widget의 파생물을 저장하며 Widget에는 가상 소멸자가 있습니다. 다형성 클래스의 경우 이것은 문제가되지 않습니다.

일단 위젯이 등록되면 모든 항목이 삭제되지 않으면 위젯을 삭제할 수 없습니다.

이 접근법의 장점은 포인터를 자유롭게 전달할 수 있다는 것입니다. 저장소가 파괴 될 때까지 모두 유효합니다. 이것은 손으로 만든 수영장의 일종입니다.

+0

나는 그것에 의해 생성되지 않은 물건을 삭제하는 것은 나쁜 생각이라고 생각합니까? 이 경우 위젯을 다른 WidgetOwner와 안전하게 공유 할 수 없습니다. –

+0

우선 이것은 완전한 디자인이 아닙니다. 이것은 더 스케치 또는 패턴입니다. 특별한 필요에 따라 조정될 수 있습니다. 둘째,이 클래스는'WidgetOwner'라고합니다. 소유권이 클래스에 전달된다는 것은 분명합니다. 이 패턴은 단 하나의 소유자를 예상합니다. 다른 모든 디자인 패턴과 마찬가지로 모든 사용 사례를 절대적으로 다루지는 않습니다. –

+0

흥미로운 아이디어 ... 모든 위젯이 동적으로 (합리적으로) 할당되었다고 가정하면 직접 등록 할 수 있습니다. 또한 어떤 이유로 든 프로그램이 끝나기 전에 위젯을 해제 할 수 있다고 결정한 경우 위젯의 소멸자에서 호출되어 두 번 삭제되지 않도록 ForgetWidget() 메서드를 추가 할 수 있습니다. – Anonymous1847

0

스마트 포인터가 최선의 선택이라고 생각합니다. 그리고 템플릿이 엉망이라 생각하면

1

가장 관용적 인 것은 어느 것입니까?

확실히 C의 ++의 다음 버전이 "가는 방법"으로하기로 결정하고, 그 스마트 포인터 일 것입니다 무슨 것이다 가장 관용적 (당신은 다른도/찾을 예를 들어 부스트에 구현을 사용할 수 있습니다 인터넷에있는 것들은 영감을 얻기 위해 더 간단 할 수 있습니다).

c++98 (고려해야 할 큰 요인)을 사용하기 때문에 그 상황에 대해 관용적 인 내용을 취할 수 있으며 그 사람의 토지가 거의 없기 때문에 대답은 가정 일 가능성이 가장 높습니다 만든 디자인은 당신에게 가장 매력적입니다.