QList的麻烦

Trouble with QList

提问人:user3204810 提问时间:3/12/2014 最后编辑:Shoeuser3204810 更新时间:6/6/2014 访问量:327

问:

如果我在函数中设置了一个 QList,它就可以正常工作

void MainWindow::ReadXML() {
    ...
    QList<QString> list;
    list << "alfa" << "beta" << "gamma" << "delta" << "epsilon";
    ...
}

但是,如果尝试在块之外编写相同的代码(QList必须对整个文件可见),Qt Creator会在最后一行用红色下划线告诉我这个错误:“expeted to declaration”

有什么建议吗?

C++ QT QT字符串 QTCore的QList 列表

评论

0赞 chris 3/12/2014
你不能把任何不是声明的东西放在全局范围内,甚至把声明放在那里通常被认为是不好的做法。
0赞 user3204810 3/12/2014
最好的方法是什么?
0赞 chris 3/12/2014
最有可能利用类或函数参数并适当地返回值。

答:

4赞 László Papp 3/12/2014 #1

您将有几种方法可以解决此问题,但这里是其中之一:

static QStringList myStringList = QStringList << "foo" << "bar" << "baz";

void MainWindow::ReadXML() 
{
    ...
    useMyStringList(myStringList);
     ...
}

但是使用这样的静态变量是不好的做法,所以我可能会更多地使用 C++,至少,我会创建一个函数如下:

static QStringList myStringList()
{
    static QStringList stringList = QStringList() << "foo" << "bar" << "baz";
    return stringList;
}


void MainWindow::ReadXML() 
{
    ...
    useMyStringList(myStringList());
     ...
}

1) 请注意,您可以使用 QStringList 而不是 QList。它将为您提供方便的方法,总的来说,感觉更自然。

2)使用C++11及更高版本,您可以使用初始值设定项列表,因此无需编写:

QStringList myStringList = QStringList << "foo" << "bar" << "baz";

您可以这样做:

QStringList myStringList{"foo", "bar", "baz"};

评论

0赞 user3204810 3/12/2014
谢谢,非常有用的信息!只有一个问题:什么是useMyStringList()?
0赞 László Papp 3/12/2014
@user3204810:这是你做的任何功能。我只是将其用作占位符。当然,如果你在不调用另一个函数的情况下处理函数中的字符串列表,你就不需要它。
0赞 Kuba hasn't forgotten Monica 3/12/2014
为了抢占过于急切的注释:值得注意的是,任何有价值的编译器,如果不是直接内联函数,都会在 中应用 NRVO,因此按值返回的效率并不比按常量引用返回的效率低(如 中)。正如 Laszlo 所建议的那样,按值返回是完全正确和惯用的。myStringListstatic const QStringList & myStringList()