最佳实践:QT4 QList <mything *> ...在堆上,或QList <mything>使用参考?</mything> </mything *>

时间:2010-03-28 14:07:31

标签: c++ qt4

学习C ++,所以要温柔:)......

我一直在设计主要是使用堆变量(由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)

将Criteria插入到列表中,并返回列表,以便我的GUI可以显示它。

我想知道我是否应该以某种方式使用引用。因为我总是想要那个准确的Criteria,我应该做完:

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)

(不确定后一行是否在语法上正确,但你得到漂移)。

所有这些项目都是特定的准全球项目,是我计划的核心。

所以,问题是这样的:我可以肯定的分配/释放我所有的记忆W / O在我现在使用的方法的问题,而是有更多的C ++的方式?引用是一个更好的选择(改变我的方式还为时不晚)。

TIA

麦克

2 个答案:

答案 0 :(得分:1)

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

如果Criteria类相当复杂,以致由于其中一个列表在某些时候被修改而产生的附带副本会产生明显的开销,那么我会在QSharedData的实现中使用Criteria 1}}所以它也只是根据需要复制。

这种方法有两个缺点:第一,复制(如果有的话)是隐式的,可能在你不期望它时发生,而且两个,它不允许Criteria的多态使用。如果您有Criteria作为类层次结构的根,那么您必须使用指针。在这种情况下,我会使用来自Boost或C ++ TR1的shared_ptr来避免内存管理麻烦,或者使CriteraQObject公开继承并使所有Critera个对象成为Decision的子对象{1}}。

答案 1 :(得分:1)

我认为参考不是更好的选择。如果要动态分配这些对象,则仍需要保留指针的副本以便稍后删除。另外,当传递指针时,您不必担心复制构造函数或隐式共享技术(如QSharedData)。你仍然会得到“确切的标准”。

我的建议是:除非你有充分的理由让事情变得更复杂,否则请保持简单。

但是,从Qt的角度来看,你通常应该传递指针或对Qt对象的引用。这些对象使用隐式共享,因此它们不像“普通”C ++对象。如果您还在学习C ++,我建议暂时将此技术从您自己的代码中删除。但要有效地使用Qt,你需要了解它是如何工作的,所以我建议在这里阅读更多相关内容:

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

祝你好运!

编辑:

有一件事我忘了提及。如果您知道不希望复制类,则可以通过声明私有复制构造函数和operator = overload强制执行此操作:

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