Russian Qt Forum

Qt => Вопросы новичков => Тема начата: alik от Июнь 09, 2015, 09:18



Название: Проблема инициализации класса внутри структуры
Отправлено: alik от Июнь 09, 2015, 09:18
Доброе утро!
У меня возникла такая проблема:

Имеется структура:
struct TStructureTerrain {
    TGeoPnt GeoPnt_LowerLeft;
    TGeoPnt GeoPnt_SW;
    TGeoPnt GeoPnt_NW;
    TGeoPnt GeoPnt_NE;
    TGeoPnt GeoPnt_SE;
    TSmallintSpaceXY Matrix;
    };

В ней есть поле Matrix типа TSmallintSpaceXY:

class TSmallintSpaceXY {
    Q_PROPERTY(qint16 Item READ get WRITE set)
private:
    qint16 *FData;
    bool CheckIndex(int X, int Y);
public:
    int FX, FY;
    TSmallintSpaceXY();
    TSmallintSpaceXY(int, int);
    ~TSmallintSpaceXY();
    qint16 get(int X, int Y);
    bool set(int X, int Y, qint16 Value);
};


Теперь в рабочем CPP блоке я пытаюсь инициализировать поле Matrix следующим образом:

    TStructureTerrain struc;
    TSmallintSpaceXY struc.Matrix(10,10);

На что компилятор ругается так:
" expected initializer before '.' token TSmallintSpaceXY struc.Matrix(10,10); "

Если я инициализирую переменную tmp типа TSmallintSpaceXY в ней структуры, то все в шоколаде:
    TSmallintSpaceXY tmp(10,10);

Что не так?




Название: Re: Проблема инициализации класса внутри структуры
Отправлено: Fregloin от Июнь 09, 2015, 09:51
нельзя так инициализировать структуры, как вы. Потому что ваша структура matrix является полем родительской структуры. задавайте значения через методы matrix.

Код:
TStructureTerrain struc;
struc.Matrix.set(10,10);


Название: Re: Проблема инициализации класса внутри структуры
Отправлено: __Heaven__ от Июнь 09, 2015, 09:58
Проблема в  TSmallintSpaceXY struc.Matrix(10,10);
Вы пытаетесь сделать, не знаю, как это даже назвать. Объявление, наверное.
В общем, у вас в структуре struc уже есть матрица со значениями по умолчанию. Обращайтесь к ней и меняйте её свойства.


Название: Re: Проблема инициализации класса внутри структуры
Отправлено: __Heaven__ от Июнь 09, 2015, 10:00
И при написании тем используйте, пожалуйста редактирование:
Код
C++ (Qt)
struct TStructureTerrain {
   TGeoPnt GeoPnt_LowerLeft;
   TGeoPnt GeoPnt_SW;
   TGeoPnt GeoPnt_NW;
   TGeoPnt GeoPnt_NE;
   TGeoPnt GeoPnt_SE;
   TSmallintSpaceXY Matrix;
   };
Код
C++ (Qt)
class TSmallintSpaceXY {
   Q_PROPERTY(qint16 Item READ get WRITE set)
private:
   qint16 *FData;
   bool CheckIndex(int X, int Y);
public:
   int FX, FY;
   TSmallintSpaceXY();
   TSmallintSpaceXY(int, int);
   ~TSmallintSpaceXY();
   qint16 get(int X, int Y);
   bool set(int X, int Y, qint16 Value);
};
Код
C++ (Qt)
TStructureTerrain struc;
   TSmallintSpaceXY struc.Matrix(10,10);
Код
C++ (Qt)
TSmallintSpaceXY tmp(10,10);
Ориентироваться удобнее.


Название: Re: Проблема инициализации класса внутри структуры
Отправлено: alik от Июнь 09, 2015, 10:08
нельзя так инициализировать структуры, как вы. Потому что ваша структура matrix является полем родительской структуры. задавайте значения через методы matrix.

Код:
TStructureTerrain struc;
struc.Matrix.set(10,10);

Вызов struc.Matrix.set(10,10,Val);
set - это метод с доп. полем  Val, он не задает размеры массива


Пробую так:    struc.Matrix(10,10);
выходит сообщение "no match for call to (TSmallintSpaceXY) (int,int)"





Название: Re: Проблема инициализации класса внутри структуры
Отправлено: alik от Июнь 09, 2015, 10:09
Проблема в  TSmallintSpaceXY struc.Matrix(10,10);
Вы пытаетесь сделать, не знаю, как это даже назвать. Объявление, наверное.
В общем, у вас в структуре struc уже есть матрица со значениями по умолчанию. Обращайтесь к ней и меняйте её свойства.

А нельзя использовать собственные конструкторы для задания размера массива?


Название: Re: Проблема инициализации класса внутри структуры
Отправлено: __Heaven__ от Июнь 09, 2015, 10:39
Можно так к примеру:
Код
C++ (Qt)
struct TStructureTerrain {
   TGeoPnt GeoPnt_LowerLeft;
   TGeoPnt GeoPnt_SW;
   TGeoPnt GeoPnt_NW;
   TGeoPnt GeoPnt_NE;
   TGeoPnt GeoPnt_SE;
   TSmallintSpaceXY Matrix;
   TStructureTerrain(int n, int m)
       : Matrix(n,m) {}
   };
 
И теперь, объявляя TStructureTerrain вы можете указать размеры матрицы:
Код
C++ (Qt)
TStructureTerrain struc(10, 10);


Название: Re: Проблема инициализации класса внутри структуры
Отправлено: alik от Июнь 09, 2015, 12:05
Можно так к примеру:
Код
C++ (Qt)
struct TStructureTerrain {
   TGeoPnt GeoPnt_LowerLeft;
   TGeoPnt GeoPnt_SW;
   TGeoPnt GeoPnt_NW;
   TGeoPnt GeoPnt_NE;
   TGeoPnt GeoPnt_SE;
   TSmallintSpaceXY Matrix;
   TStructureTerrain(int n, int m)
       : Matrix(n,m) {}
   };
 
И теперь, объявляя TStructureTerrain вы можете указать размеры матрицы:
Код
C++ (Qt)
TStructureTerrain struc(10, 10);

А как сделать инициализацию TStructureTerrain struc(10, 10) по адресу структуры:

bool LoadTerrain_SRTM(QString FileName, TStructureTerrain *struc)
{
...
TStructureTerrain struc???(10, 10)???


Название: Re: Проблема инициализации класса внутри структуры
Отправлено: __Heaven__ от Июнь 09, 2015, 12:25
Вам бы знаний поднабраться... Это основы. Книг много.

в функцию LoadTerrain_SRTM передавайте &struc, Который был ранее создан.


Название: Re: Проблема инициализации класса внутри структуры
Отправлено: alik от Июнь 09, 2015, 12:36
Вам бы знаний поднабраться... Это основы. Книг много.

в функцию LoadTerrain_SRTM передавайте &struc, Который был ранее создан.

Меня интересует как по адресу вызвать TStructureTerrain адрес(struc)(10,10) ?
Очевидно, нужно указывать что то типа -> ?
Но где, в каком месте раскрыть адрес?


Название: Re: Проблема инициализации класса внутри структуры
Отправлено: Авварон от Июнь 09, 2015, 13:30
Нивапрос
Код:
TStructureTerrain struc;
struc.Matrix.~TSmallintSpaceXY(); // удаляем УЖЕ СОЗДАННЫЙ матрикс
new (&struc.Matrix) TSmallintSpaceXY(10,10); // создаем новый на его месте


Название: Re: Проблема инициализации класса внутри структуры
Отправлено: __Heaven__ от Июнь 09, 2015, 13:47
Крутяк  :D
А вызов деструктора - это безболезненно для данной ситуации?


Название: Re: Проблема инициализации класса внутри структуры
Отправлено: Авварон от Июнь 09, 2015, 13:54
А какая разница? Главное, чтобы на момент вызова деструктора верхнего класса мембер был жив, иначе UB.


Название: Re: Проблема инициализации класса внутри структуры
Отправлено: Igors от Июнь 09, 2015, 13:58
Теперь в рабочем CPP блоке я пытаюсь инициализировать поле Matrix следующим образом:

    TStructureTerrain struc;
    TSmallintSpaceXY struc.Matrix(10,10);
Проще всего так
Код
C++ (Qt)
TStructureTerrain struc;
struc.Matrix = TSmallintSpaceXY(10,10);
 
А если все время 10, 10 то удобнее
Код
C++ (Qt)
class TSmallintSpaceXY
...
   TSmallintSpaceXY(int n = 10, int m = 10);
 
А если 10, 10 для Terrain, то
Код
C++ (Qt)
struct TStructureTerrain {
...
   TStructureTerrain() : Matrix(10, 10) {}
,,,
};


Название: Re: Проблема инициализации класса внутри структуры
Отправлено: alik от Июнь 09, 2015, 14:20
Нивапрос
Код:
TStructureTerrain struc;
struc.Matrix.~TSmallintSpaceXY(); // удаляем УЖЕ СОЗДАННЫЙ матрикс
new (&struc.Matrix) TSmallintSpaceXY(10,10); // создаем новый на его месте

Спасибо большое, вот с такой записью компилятор согласился:
struc->Matrix.~TSmallintSpaceXY(); // удаляем УЖЕ СОЗДАННЫЙ матрикс
new (&struc->Matrix) TSmallintSpaceXY(10,10); // создаем новый на его месте

Теперь буду проверять по факту!)


Название: Re: Проблема инициализации класса внутри структуры
Отправлено: alik от Июнь 09, 2015, 14:38
Нивапрос
Код:
TStructureTerrain struc;
struc.Matrix.~TSmallintSpaceXY(); // удаляем УЖЕ СОЗДАННЫЙ матрикс
new (&struc.Matrix) TSmallintSpaceXY(10,10); // создаем новый на его месте

А можно вот так проверять создан ли класс или нет:

bool LoadTerrain_SRTM(QString FileName, TStructureTerrain *struc)
{
....
if ((&struc != NULL) & (&struc.Matrix != NULL)) struc.Matrix.~TSmallintSpaceXY(); // удаляем УЖЕ СОЗДАННЫЙ матрикс
new (&struc.Matrix) TSmallintSpaceXY(10,10); // создаем новый на его месте




Название: Re: Проблема инициализации класса внутри структуры
Отправлено: Авварон от Июнь 09, 2015, 17:17
Нет


Название: Re: Проблема инициализации класса внутри структуры
Отправлено: Hrundel от Июнь 09, 2015, 22:27
Внутри структур можно использовать функции - делайте все что вам нужно через функции.


Название: Re: Проблема инициализации класса внутри структуры
Отправлено: alik от Июнь 10, 2015, 12:58
Ок, большое спасибо всем !


Название: Re: Проблема инициализации класса внутри структуры
Отправлено: Igors от Июнь 10, 2015, 14:22
Имеется структура:
struct TStructureTerrain {
    TGeoPnt GeoPnt_LowerLeft;
    TGeoPnt GeoPnt_SW;
    TGeoPnt GeoPnt_NW;
    TGeoPnt GeoPnt_NE;
    TGeoPnt GeoPnt_SE;
    TSmallintSpaceXY Matrix;
    };
Как давать имена классам и переменным - совсем не мелочь. Стремитесь чтобы каждая часть имени была с какой-то полезной смысловой нагрузкой, напр
Код
C++ (Qt)
struct TTerrain {
   TGeoPnt m_LowerLeft;
   TGeoPnt m_SW;
   TGeoPnt m_NW;
   TGeoPnt m_NE;
   TGeoPnt m_SE;
   TSmallMatrix m_Matrix;
};
 
Префикс для членов (здесь m_) - ну пишут всяко, и вообще без него, но большинство все-таки члены выделяет, резоны есть