在附加到QList时实例化QObject类

时间:2015-08-29 16:05:48

标签: qt

我有以下代码:

MyListViewItemDataSubListItem *subItem = NULL;
QList<QObject*> subListNumberOfPlayers;

//this works but is a bit long ;-)
subItem = new MyListViewItemDataSubListItem(this, "10");
subListNumberOfPlayers.append(subItem);
subItem = new MyListViewItemDataSubListItem(this, "9");
subListNumberOfPlayers.append(subItem);
subItem = new MyListViewItemDataSubListItem(this, "8");
subListNumberOfPlayers.append(subItem);
subItem = new MyListViewItemDataSubListItem(this, "7");
subListNumberOfPlayers.append(subItem);

是否也可以执行以下操作?或者更好......当我这样做时,会不会有任何不必要的副作用或不良行为?

subListNumberOfPlayers.append(new MyListViewItemDataSubListItem(this, "10"));
subListNumberOfPlayers.append(new MyListViewItemDataSubListItem(this, "9"));
subListNumberOfPlayers.append(new MyListViewItemDataSubListItem(this, "8"));
subListNumberOfPlayers.append(new MyListViewItemDataSubListItem(this, "7"));

2 个答案:

答案 0 :(得分:0)

是的,是的,但是这样你就没有机会检查close_event是否在出现问题时返回零。您可以可能附加零,并在以后尝试使用它时发生崩溃。

答案 1 :(得分:0)

没有副作用,但使用append 仍然长。您可以一次性初始化整个列表:

auto subListNumberOfPlayers = QList<QObject*>()
  << new MyListViewItemDataSubListItem(this, "10")
  << new MyListViewItemDataSubListItem(this, "9")
  << new MyListViewItemDataSubListItem(this, "8")
  << new MyListViewItemDataSubListItem(this, "7");

如果您关心最后一点性能,可以在列表中保留空间,以便它可以为您要插入的所有项目留出空间,而无需重新分配。 std::list没有提供该界面,但QList可以。对于少量项目,第一个附加项(<<)已经分配了足够的空间,因此此处不需要显式调用。

您也可以使用std::list并存储对象值,但这只有在您的所有实例属于同一类型时才有效。

std::list<MyListViewItemDataSubListItem> l;
l.emplace_back(this, "10");
l.emplace_back(this, "9");
l.emplace_back(this, "8");
l.emplace_back(this, "7");
auto & subListNumberOfPlayers = l;

如果您真的想要简洁,可以使用构造函数参数序列易于生成的事实。它对reserve这里的空间很有用,因为循环很灵活:

const int n = 4;
QList<QObject*> subListNumberOfPlayers;
subListNumberOfPlayers.reserve(n);
for (int i = 10; i > (10-n); --i) subListNumberOfPlayers
  << new MyListViewItemDataSubListItem(this, QString::number(i));