2010-03-28 52 views
2

学习C++,所以,请温柔:)...最佳实践:QT4 QList <Mything*> ...在堆,或QList <Mything>使用参考?

我一直在设计我的应用程序主要利用堆变量(由C来),所以我设计的结构是这样的:

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

所有通过我的程序,我会传递指向特定标准的指针,或者通常是指向列表。所以,我必须声明这样的功能:

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

其插入一个标准到一个列表,并返回列表,所以我的GUI可以显示它。

我想知道如果我应该使用引用,不知何故。由于我总是想,准确的标准回去,我应该这样做:

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

删除我的旧的答案,因为我没能真正读懂你想要的东西。 ..新的答案应该是更好的针对性。 – 2010-03-28 19:05:07

回答

1

我将返回QList<Criteria>作为一个普通值。 QList是Qt的共享类之一,这意味着它的内部表示形式在多个实例之间共享,只要它们都没有被修改。

如果Criteria类是相当复杂的,例如,一个偶然的副本作出,因为列表中的一个在某个时候修改即被noticable开销,那么我会在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

祝你好运!

编辑:

有一件事我忘了提及。如果你知道你不想复制你的类,你可以通过声明的私人拷贝构造函数和operator =重载执行本:

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