2012-02-16 148 views
0

进出口创造QT模型,并跨越这些代码来:带有qList引用的构造函数,它是如何工作的?

class StringListModel : public QAbstractListModel 
{ 
    Q_OBJECT 

public: 
    StringListModel(const QStringList &strings, QObject *parent = 0) 
    : QAbstractListModel(parent), stringList(strings) {} 

    int rowCount(const QModelIndex &parent = QModelIndex()) const; 
    QVariant data(const QModelIndex &index, int role) const; 
    QVariant headerData(int section, Qt::Orientation orientation, 
        int role = Qt::DisplayRole) const; 

private: 
    QStringList stringList; 
}; 

现在我不知道,这是否工作?如果将一个qstringlist传递给该函数,并且它超出了作用域,那么这个对象是否会放弃它的字符串列表?

同时读取: C++ reference in constructor 和: Constructors accepting string reference. Bad idea?

..其中一些人说,这将是无效的,但也有人说,该字符串(在他们的例子)将被复制到本地变量。这真是令人困惑。

回答

2

如果我明白你在问什么,你担心,因为QStringList &strings通过引用传递?

初始化列表调用stringList(const &QStringList)复制构造函数。此复制构造函数将通过的&QStringList对象的状态复制到新对象,并将该对象指定为stringList。这样,即使原始&strings超出范围或以其他方式销毁,由于stringList指向不同对象也无所谓。

在第二个链接中没有调用复制构造函数...将成员对象指定为指向传递给它的相同对象。如果传递的对象在程序中稍后被销毁,则成员对象仍将指向该被销毁的对象,从而使其无效。

+0

等什么?我可以看到:myclass(const std :: string&_name):name(_name){} 和StringListModel(const QStringList&strings,QObject * parent = 0) :QAbstractListModel(parent),stringList(strings){} 你能解释一下吗? – chikuba 2012-02-16 01:44:46

+1

我想他的意思是说“你的第二个环节”,而不是第一个。如果你正在存储一个给定的QStringList的引用,而不仅仅是使用被复制到你的成员变量中的引用,那么你的示例只会有问题。 – Chris 2012-02-16 03:28:27

+0

@Chris好的。我的意思是第二环节。 – 2012-02-16 05:39:48