Russian Qt Forum

Qt => Общие вопросы => Тема начата: kuzulis от Июнь 29, 2009, 09:00



Название: Компилятор не видит в приватной секции QVector ! Не пойму изза чего.
Отправлено: kuzulis от Июнь 29, 2009, 09:00
Доброго времени суток!

Имею...

modbusnode.h
Код:
class TModbusNode : public QObject
{
Q_OBJECT
...
public:
...
private:
    class TPrivateData : public QSharedData{
        ...
        QVector< QList< TModbusRegister * > > regArray(NUM_TYPES_REG); // <- это строка № 147
        ...
    }
    QSharedDataPointer<TPrivateData> d;

modbusnode.cpp
Код:
....
quint16 TModbusNode::regQuantity(TModbusRegister::TModbusRegisterType rtype) const
{
switch (rtype) {
case TModbusRegister::Reg_0x: return (quint16)d->regArray.at(0).count(); // <- строка №57
case TModbusRegister::Reg_1x: return (quint16)d->regArray.at(1).count(); // <- строка №58
case TModbusRegister::Reg_3x: return (quint16)d->regArray.at(2).count(); // <- строка №59
case TModbusRegister::Reg_4x: return (quint16)d->regArray.at(3).count(); // <- строка №60
case TModbusRegister::Reg_6x: return (quint16)d->regArray.at(4).count(); // <- строка №61
default: return 0;
}
}
....

кусок вывода компилятора:
Цитировать
....
In file included from modbusnode.cpp:15:
modbusnode.h:147: error: expected `;' before '(' token
modbusnode.cpp: In member function `quint16 TModbusNode::regQuantity(TModbusRegister::TModbusRegiste
rType) const':
modbusnode.cpp:57: error: 'const class TModbusNode::TPrivateData' has no member named 'regArray'
modbusnode.cpp:58: error: 'const class TModbusNode::TPrivateData' has no member named 'regArray'
modbusnode.cpp:59: error: 'const class TModbusNode::TPrivateData' has no member named 'regArray'
modbusnode.cpp:60: error: 'const class TModbusNode::TPrivateData' has no member named 'regArray'
modbusnode.cpp:61: error: 'const class TModbusNode::TPrivateData' has no member named 'regArray'
....

и т.п. ошибок оч много! 

Вопрос: что я делаю не так? Почему пишет, что нету у меня regArray ?


Название: Re: Компилятор не видит в приватной секции QVector ! Не пойму изза чего.
Отправлено: Rcus от Июнь 29, 2009, 09:32
regArray это не объялвение поля класса, а неизвестно что, скорее похоже на объявление метода, если бы NUM_TYPES_REG было именем типа.


Название: Re: Компилятор не видит в приватной секции QVector ! Не пойму изза чего.
Отправлено: kuzulis от Июнь 29, 2009, 09:46
Цитировать
regArray это не объялвение поля класса, а неизвестно что, скорее похоже на объявление метода.
не понял? regArray - это массив списков (из 5-ти элементов), который в QSharedData я "втиснул"! Что имеете ввиду?

Цитировать
если бы NUM_TYPES_REG было именем типа
эммм... ну NUM_TYPES_REG объявлена как:
Код:
       ....
static const int NUM_TYPES_REG=5; //количество типов регистров (0x+1x+3x+4x+6x = 5)
       ....


если Вас смутило то, что нет слова public - то оно есть:
Код:
    class TPrivateData : public QSharedData{
    [b]public:[/b]
        ...
        QVector< QList< TModbusRegister * > > regArray(NUM_TYPES_REG); // <- это строка № 147
        ...
    }



Название: Re: Компилятор не видит в приватной секции QVector ! Не пойму изза чего.
Отправлено: Rcus от Июнь 29, 2009, 09:52
Не надо путать объявление и инициализацию. Перенесите вызов конструктора вектора в список инициализации при конструкторе TPrivateData


Название: Re: Компилятор не видит в приватной секции QVector ! Не пойму изза чего.
Отправлено: kuzulis от Июнь 29, 2009, 09:56
не понял, зачем?

из примера в ассистенте:
Код:
    class EmployeeData : public QSharedData
    {
    public:
        int id;
        QString name;
    };
тоже QString никуда в конструктор не вынесен... и я подумал что и QVector в принципе ничем не отличается, если его вместо QString подставить


Название: Re: Компилятор не видит в приватной секции QVector ! Не пойму изза чего.
Отправлено: Rcus от Июнь 29, 2009, 10:02
/** \facepalm */... Зачем так избирательно цитировать пример?


Название: Re: Компилятор не видит в приватной секции QVector ! Не пойму изза чего.
Отправлено: kuzulis от Июнь 29, 2009, 10:30
сделал так:
Код:
class TModbusNode : public QObject
{
Q_OBJECT
...
public:
...
private:
    class TPrivateData : public QSharedData{
        [b]TPrivateData () { regArray.resize(NUM_TYPES_REG); }[/b]
        ...
        QVector< QList< TModbusRegister * > >  regArray;
        ...
    }
    QSharedDataPointer<TPrivateData> d;
}
и вроде заработало. Спасибо ! :)