2010-03-28 4 views
2

학습 C++, 그래서 부드럽게모범 사례 : QT4 QList <Mything*> ... 힙 또는 QList <Mything> 참조를 사용합니까? 내 응용 프로그램이 주로) C에서 오는 (힙 변수를 사용하여 설계되었다</p> <p>...) 그래서 나는이 같은 설계 구조를했습니다 :

QList<Criteria*> _Criteria; 
// ... 
Criteria *c = new Criteria(....); 
_Criteria.append(c); 

모든 내 프로그램을 통해, 나는 특정 기준 또는 종종 목록에 대한 포인터를 전달하고있다. 목록에 기준을 삽입하고 목록이 너무 내 GUI를 표시 할 수 있습니다 반환

QList<Criteria*> Decision::addCriteria(int row,QString cname,QString ctype); 
Criteria * Decision::getCriteria(int row,int col) 

: 그래서,이 같은 선언하는 기능이있다.

어떻게 든 참조를 사용해야하는 지 궁금합니다. 난 항상 다시 그 정확한 기준을 꿔 때문에, 나는 했어야 :

QList<Criteria> _Criteria; 
// .... 
Criteria c(....); 
_Criteria.append(c); 

을 ...

QList<Criteria>& Decision::addCriteria(int row,QString cname,QString ctype); 
Criteria& Decision::getCriteria(int row,int col) 

(후자의 라인이 아직 문법적으로 정확하지만 당신은 드리프트를 얻을 수 있는지 확실하지 않습니다).

이 모든 항목은 내 프로그램의 핵심 인 특정, 유사 글로벌 항목입니다.

그럼, 질문은 이것입니다 : 나는 확실히 사용할 수있는 모든 메모리를 해제 할 수 있습니다. 지금은 사용하고있는 방법에 문제가 없지만 더 많은 C++ 방법이 있습니까? 참조가 더 나은 선택이었을 것입니까? (내 편에서는 너무 늦지 않았습니다.)

일반 값으로 TIA

마이크

+0

, 나의 오래된 대답을 삭제. 새로운 대답은 더 나은 목표가되어야합니다. –

답변

1

내가 반환 QList<Criteria>. QList은 Qt의 공유 클래스 중 하나이며, 내부 표현은 수정되지 않는 한 여러 인스턴스간에 공유됩니다.

Criteria 클래스는, 너무 만되도록 목록 중 하나가 눈에 띄는 오버 헤드, 그때 Criteria의 구현에 QSharedData을 사용 데 발생한 어떤 시점에서 수정되기 때문에 부수적 복사본을 만든 것을 상당히 복잡한 같은 경우 필요에 따라 복사합니다.

이 접근법에는 다음과 같은 두 가지 단점이 있습니다. 하나는 복사하면 암시 적이며 기대하지 않을 때 발생할 수 있고 두 가지는 Criteria의 다형성 사용을 허용하지 않습니다. Criteria을 클래스 계층 구조의 루트로 사용하는 경우에는 포인터를 사용해야합니다. 이 경우 Boost 또는 C++ TR1의 shared_ptr을 사용하여 메모리 관리 번거 로움을 피하거나 Critera을 공개적으로 QObject에서 상속 받도록하고 Critera의 모든 객체를 Decision의 자식으로 만듭니다.

1

나는 참조가 더 나은 선택이라고 생각하지 않습니다. 이러한 개체를 동적으로 할당하는 경우 포인터를 복사하여 나중에 삭제해야합니다. 또한 포인터 주위를 지나갈 때 QSharedData와 같은 복사 생성자 또는 암시 적 공유 기술에 대해 걱정할 필요가 없습니다. 당신은 여전히 ​​"정확한 기준"을 되 찾을 것입니다.

제 조언은 다음과 같습니다. 당신이 일을 좀 더 복잡하게 만드는 좋은 이유가 없다면, 간단하게하십시오.

그러나 Qt 입장에서는 일반적으로 이 아니며은 Qt 객체에 대한 포인터 또는 참조를 전달하지 않아야합니다. 이러한 객체 을 사용하여 암시 적 공유를 사용하므로 "정상적인"C++ 객체처럼 작동하지 않습니다. 만약 당신이 여전히 C + +를 배우고 있다면 나는 지금 당신 자신의 코드에서이 기술을 떠날 것을 제안 할 것이다. 그러나 효과적으로 당신이 내가 여기에 대한 자세한 내용을 읽어 보시기 바랍니다 어떻게 작동하는지 이해하는 데 필요한 Qt를 사용하기 :

http://qt.nokia.com/doc/4.6/implicit-sharing.html

행운을 빕니다!

편집 : 내가 얘기를 깜빡 했네요

한 가지. 당신은 당신 클래스는 복사하지 않으 알고 있다면, 당신은 개인 복사 생성자와 연산자 = 과부하를 선언하여이를 적용 할 수 있습니다 : 정말 당신이 원하는 무엇을 읽지 못했습니다으로

class A 
{ 
    //Code goes here 
private: 
    A(const A&); 
    A& operator=(const A&); 
};