Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > Помогите решить проблему


Автор: Crywolf 8.6.2010, 18:35
В общем такое дело.Пишу одну программу.Написал свой класс.Во его .н файл
Код

#ifndef PILOT_H
#define PILOT_H
#include <QObject>
#include <QString>

class Pilot : public QObject
{
    Q_OBJECT
private:
    QString name;
    QString abr;
    unsigned int qPlace;
    unsigned int rPlace;
    //QString **race_rates;
public:
    //Pilot & operator=(const Pilot &other);
    Pilot(QString *,QString *);
    Pilot();
    void setPilotName(QString);
    void setPilotAbr(QString);
};

#endif // PILOT_H

и вот цппшник
Код

#include "Pilot.h"
#include <QString>

Pilot::Pilot(QString *n,QString *ab)
{
    name = *n;
    abr = *ab;
    qPlace = 0;
    rPlace = 0;
}
Pilot::Pilot()
{
    qPlace = 0;
    rPlace = 0;
}
void Pilot::setPilotName(QString n)
{
    name = n;
}
void Pilot::setPilotAbr(QString ab)
{
    abr = ab;
}

Так вот, в другом классе я создаю массив этих объектов.Но не могу толком выделить для них память.Вот что я пробую:
Код

    Progn *clfp[num1];
    Pilot *pileton[num2];
    for (int i=0;i<num1;i++)
        clfp[i] = new Progn();
    for (int i=0;i<num2;i++)
        pileton[i] = new Pilot();

num1 и num2 - любые числа.
Помогите пожалуйста!!В чём может быть проблема?

Автор: borisbn 9.6.2010, 06:19
Если num1 и num2 это переменные, то так
> P i l o t * p i l e t o n [ n um2 ]
описывать массив указателей нельзя. Нужно выделить его динамически:
P i l o t ** p i l e t o n =new Pilot*[ n um2 ];
и далее по тексту.
А лучше использовать
std::vector< Pilot* >

Автор: boostcoder 9.6.2010, 06:37
Цитата(borisbn @  9.6.2010,  06:19 Найти цитируемый пост)
описывать массив указателей нельзя.

можно.
но каждому указателю нужно выделить память.
но как уже сказали -
Цитата(borisbn @  9.6.2010,  06:19 Найти цитируемый пост)
std::vector< Pilot* > 


но еще лучше, если очень нужно хранить указатели:
std::vector<std::shared_ptr<Pilot>>

Автор: borisbn 9.6.2010, 07:54
boostcoder, если num1 - переменная, а не константа, то так выделять можно только на стеке, и, если не изменяет память, не во всех компиляторах. С shared_ptr полностью согласен (-1 мне, за то, что забыл smile )

Автор: boostcoder 9.6.2010, 09:32
Цитата(borisbn @  9.6.2010,  07:54 Найти цитируемый пост)
если не изменяет память, не во всех компиляторах.

угу. насколько мне известно, только в gcc.

Автор: djamshud 9.6.2010, 10:55
Цитата

8.3.4 Arrays
In a declaration T D where D has the form

   D1 [constant-expression]


Цитата

5.19 Constant expressions

An integral constant-expression can involve only literals (2.13), enumerators, const variables or static
data members of integral or enumeration types initialized with constant expressions (8.5), non-type tem-
plate parameters of integral or enumeration types, and sizeof expressions. Floating literals (2.13.3) can
appear only if they are cast to integral or enumeration types. Only type conversions to integral or enumera-
tion types can be used. In particular, except in sizeof expressions, functions, class objects, pointers, or
references shall not be used, and assignment, increment, decrement, function-call, or comma operators shall
not be used.


По стандарту размер массива указывается константой. Прямых ссылок не дам, я из pdf-ки копировал, стандарт 2003-го года.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)