2015-08-07 2 views
0

Я пытаюсь создать функцию, которая возвращает QStringList компаний, которые были первоначально сохранены в QList<company*> list. Когда я пытаюсь добавить элементы в QStringList, я получаю следующее сообщение об ошибке:Вопрос класса контейнера QT

C:\Qt\Qt5.3.0\Tools\QtCreator\bin\test\companylist.cpp:13: error: passing 'const QStringList' as 'this' argument of 'QList<T>& QList<T>::operator+=(const T&) [with T = QString]' discards qualifiers [-fpermissive] 
    m_sortedList += m_companyList.at(i)->toString(); 
       ^

Любая идея, что я делаю не так? я также пытался использовать m_sortedList.append() не повезло ...

Мой код:

QStringList CompanyList::getCompanyList() const { 
    for (int i = 0; i <= m_companyList.length(); ++i) { 
     m_sortedList += m_companyList.at(i)->toString(); 
    } 
    m_sortedList.sort(); 
    return m_sortedList; 
} 
+1

Может быть потому, что «Уст» в подписи функции? Эта константа означает, что внутреннее состояние объекта не будет изменено. –

ответ

3

В getCompanyList() const, все члены Уст. Таким образом, тип m_sortedList равен const QStringList, и вы не можете изменить его.

Нет причин иметь m_sortedList в качестве участника, хотя, поскольку вы всегда перезаписываете его. Более того, вы, кажется, никогда не чистите его. Если вы вызовете (не константу) getCompanyList более одного раза, вы получите список с дублируемыми записями.

Чтобы избежать преждевременной пессимизации при выращивании списка, который будет иметь известный размер, вы должны убедиться, что он имеет достаточное количество элементов, вызывая reserve.

Что вы ищете типичный местный возвращаемое значение идиомы:

// C++11 
QStringList CompanyList::getCompanyList() const { 
    QStringList result; 
    result.reserve(m_companyList.size()); 
    for (auto c : m_companyList) result << c->toString(); 
    std::sort(result.begin(), result.end()); 
    return result; 
} 

// C++03, this is a more declarative style loved by some OSS projects :) 
QStringList CompanyList::getCompanyList() const { 
    QStringList result; 
    result.reserve(m_companyList.size()); 
    std::transform(c.begin(), c.end(), std::back_inserter(result), 
       std::mem_fn(&company::toString)); 
    std::sort(result.begin(), result.end()); 
    return result; 
} 

// C++98 
QStringList CompanyList::getCompanyList() const { 
    QStringList result; 
    result.reserve(m_companyList.size()); 
    foreach (company * c, m_companyList) result << c->toString(); // or Q_FOREACH 
    std::sort(result.begin(), result.end()); 
    return result; 
} 
+0

Спасибо за помощь. Я не должен использовать пространство имен std C++. Любая идея, как я мог избежать дублирования в противном случае? Только QT ... – user2094257

+0

@ user2094257 Невозможно продуктивно использовать C++ без использования пространства имен std. Qt использует его много, даже в своих заголовках. Вы можете использовать первый вариант C++ 11 и заменить 'std :: sort' на' qSort' - это позволит вам избежать прямого использования пространства имен std. –

Смежные вопросы