Название: Проблема инициализации класса внутри структуры Отправлено: 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; Название: Re: Проблема инициализации класса внутри структуры Отправлено: __Heaven__ от Июнь 09, 2015, 09:58 Проблема в TSmallintSpaceXY struc.Matrix(10,10);
Вы пытаетесь сделать, не знаю, как это даже назвать. Объявление, наверное. В общем, у вас в структуре struc уже есть матрица со значениями по умолчанию. Обращайтесь к ней и меняйте её свойства. Название: Re: Проблема инициализации класса внутри структуры Отправлено: __Heaven__ от Июнь 09, 2015, 10:00 И при написании тем используйте, пожалуйста редактирование:
Код
Код
Код
Код Ориентироваться удобнее. Название: Re: Проблема инициализации класса внутри структуры Отправлено: alik от Июнь 09, 2015, 10:08 нельзя так инициализировать структуры, как вы. Потому что ваша структура matrix является полем родительской структуры. задавайте значения через методы matrix. Код: TStructureTerrain struc; Вызов 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 Можно так к примеру:
Код И теперь, объявляя TStructureTerrain вы можете указать размеры матрицы: Код
Название: Re: Проблема инициализации класса внутри структуры Отправлено: alik от Июнь 09, 2015, 12:05 Можно так к примеру: Код И теперь, объявляя TStructureTerrain вы можете указать размеры матрицы: Код
А как сделать инициализацию 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; Название: 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); Код А если все время 10, 10 то удобнее Код А если 10, 10 для Terrain, то Код
Название: Re: Проблема инициализации класса внутри структуры Отправлено: alik от Июнь 09, 2015, 14:20 Нивапрос Код: TStructureTerrain struc; Спасибо большое, вот с такой записью компилятор согласился: struc->Matrix.~TSmallintSpaceXY(); // удаляем УЖЕ СОЗДАННЫЙ матрикс new (&struc->Matrix) TSmallintSpaceXY(10,10); // создаем новый на его месте Теперь буду проверять по факту!) Название: Re: Проблема инициализации класса внутри структуры Отправлено: alik от Июнь 09, 2015, 14:38 Нивапрос Код: TStructureTerrain struc; А можно вот так проверять создан ли класс или нет: 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; }; Код Префикс для членов (здесь m_) - ну пишут всяко, и вообще без него, но большинство все-таки члены выделяет, резоны есть |