Russian Qt Forum

Qt => Общие вопросы => Тема начата: daenux от Ноября 17, 2010, 20:27



Название: Создание вектора содержащего структуры
Отправлено: daenux от Ноября 17, 2010, 20:27
Есть QVector!

Код:
    struct gStruct {
        QString *gId;
        QString *gDesignation;
    };

    gStruct *braceGroups;

    QVector<gStruct> *gVector;

Так правильно создавать вектор, каждый элемент каторого содержит указанную структуру?

Код:
gVector = new QVector<gStruct>();

    if (qsqTransactions->exec("SELECT \"ID_GROUP\", \"DESIGNATION\" FROM \"T_GROUPS\" ORDER BY \"DESIGNATION\";")) {
        while (qsqTransactions->next()) {
            braceGroups = new gStruct;

            braceGroups->gId = new QString();

            *braceGroups->gId = qsqTransactions->record().field("ID_GROUP").value().toString();

            braceGroups->gDesignation = new QString();

            *braceGroups->gDesignation = qsqTransactions->record().field("DESIGNATION").value().toString();

            gVector->push_back(*braceGroups);
        }
    }


Название: Re: Создание вектора содержащего структуры
Отправлено: Пантер от Ноября 17, 2010, 20:35
Зачем все в куче?
Код
C++ (Qt)
struct gStruct {
       QString gId;
       QString gDesignation;
   };
 
 
 
   QVector<gStruct> gVector;
if (qsqTransactions.exec("SELECT \"ID_GROUP\", \"DESIGNATION\" FROM \"T_GROUPS\" ORDER BY \"DESIGNATION\";")) {
       while (qsqTransactions.next()) {
           gStruct braceGroups;
           braceGroups.gId = qsqTransactions.record().field("ID_GROUP").value().toString();
           braceGroups.gDesignation = qsqTransactions.record().field("DESIGNATION").value().toString();
           gVector.push_back(braceGroups);
       }
   }


Название: Re: Создание вектора содержащего структуры
Отправлено: Karl-Philipp от Ноября 17, 2010, 20:37
1. Зачем вектор был объявлен в виде указателя?
2. Что за необходимость создавать указатели на QString внутри структуры в данном случае?

я бы хранил указатели на структуру в векторе, а в самой структуре обычные стековые переменные.

Код
C++ (Qt)
struct gStruct {
       QString gId;
       QString gDesignation;
   };
 
...
 
   QVector<gStruct *> gVector;


Название: Re: Создание вектора содержащего структуры
Отправлено: daenux от Ноября 17, 2010, 20:50
Спасибо вам обоим!

Я сделал как Пантер велел, все с этим согласны?

А так как terlan у меня не получилось, можете пожалуста дописать код для наглядности!


Название: Re: Создание вектора содержащего структуры
Отправлено: Karl-Philipp от Ноября 17, 2010, 21:14
Код
C++ (Qt)
struct gStruct {
       QString gId;
       QString gDesignation;
   };
 
...
 
   QVector<gStruct *> gVector;
 
if (qsqTransactions.exec("SELECT \"ID_GROUP\", \"DESIGNATION\" FROM \"T_GROUPS\" ORDER BY \"DESIGNATION\";"))
{
       vector<gStruct *>::iterator iteratorGVector;
       while (qsqTransactions.next())
       {
 
gVector.push_back( new gStruct() );
iteratorGVector = gVector.end() - 1; // установили итератор на только что созданный указатель вектора
 
       (*iteratorGVector)->gId = qsqTransactions.record().field("ID_GROUP").value().toString();
       (*iteratorGVector)->gDesignation = qsqTransactions.record().field("DESIGNATION").value().toString();
       }
}
 

Код не проверял, но моя идея такова :)


Название: Re: Создание вектора содержащего структуры
Отправлено: Пантер от Ноября 17, 2010, 21:18
terlan, зачем такие извращения?
Код
C++ (Qt)
struct gStruct {
       QString gId;
       QString gDesignation;
   };
 
...
 
   QVector<gStruct *> gVector;
 
if (qsqTransactions.exec("SELECT \"ID_GROUP\", \"DESIGNATION\" FROM \"T_GROUPS\" ORDER BY \"DESIGNATION\";"))
{
       gStruct *s;
       while (qsqTransactions.next())
       {
 
s = new gStruct();
       s->gId = qsqTransactions.record().field("ID_GROUP").value().toString();
       s->gDesignation = qsqTransactions.record().field("DESIGNATION").value().toString();
       gVector.push_back (s);
       }
}
 


Название: Re: Создание вектора содержащего структуры
Отправлено: daenux от Ноября 17, 2010, 21:27
Спасибо!!!