c++ - 最佳实践 : QT4 QList<Mything*>. .. 在堆上,或 QList<Mything> 使用引用?

标签 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)

它将一个条件插入到列表中,并返回列表以便我的 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

迈克

最佳答案

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

如果Criteria类相当复杂,因此由于其中一个列表在某个时候被修改而进行的偶然复制会导致明显的开销,那么我会使用 QSharedData在执行Criteria这样它也只在需要时才被复制。

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

关于c++ - 最佳实践 : QT4 QList<Mything*>. .. 在堆上,或 QList<Mything> 使用引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2533167/

相关文章:

c++ - 获取我的文档的路径

c++ - 为什么 INSERT 和 DELETE 会搞砸 QTableView(Qt、C++、sqlite)?

c++ - 如何将任何 DLL 链接到 Cmake 项目

c++ - 为什么fstream打印出文件的最后一条记录

c++ - new >> 我如何将一个包含 3 列且每列包含 100 个数字的文件读取到一个数组中?

c++ - 在 C++ 中增加自定义对象数组的大小

c++ - Qt/C++ - 如何存储配置数据

c++ - Visual C++ 2010 速成版 : How to use with Qt?

QT4中的C++简单计算器

python - 如何显示/隐藏带有运动动画的子 QWidget?