Russian Qt Forum
Ноябрь 25, 2024, 12:27 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Проблема инициализации класса внутри структуры  (Прочитано 7168 раз)
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);

Что не так?


Записан
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #1 : Июнь 09, 2015, 09:51 »

нельзя так инициализировать структуры, как вы. Потому что ваша структура matrix является полем родительской структуры. задавайте значения через методы matrix.

Код:
TStructureTerrain struc;
struc.Matrix.set(10,10);
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #2 : Июнь 09, 2015, 09:58 »

Проблема в  TSmallintSpaceXY struc.Matrix(10,10);
Вы пытаетесь сделать, не знаю, как это даже назвать. Объявление, наверное.
В общем, у вас в структуре struc уже есть матрица со значениями по умолчанию. Обращайтесь к ней и меняйте её свойства.
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #3 : Июнь 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);
Ориентироваться удобнее.
Записан
alik
Гость
« Ответ #4 : Июнь 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)"



Записан
alik
Гость
« Ответ #5 : Июнь 09, 2015, 10:09 »

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

А нельзя использовать собственные конструкторы для задания размера массива?
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #6 : Июнь 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);
Записан
alik
Гость
« Ответ #7 : Июнь 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)Непонимающий
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #8 : Июнь 09, 2015, 12:25 »

Вам бы знаний поднабраться... Это основы. Книг много.

в функцию LoadTerrain_SRTM передавайте &struc, Который был ранее создан.
Записан
alik
Гость
« Ответ #9 : Июнь 09, 2015, 12:36 »

Вам бы знаний поднабраться... Это основы. Книг много.

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

Меня интересует как по адресу вызвать TStructureTerrain адрес(struc)(10,10) ?
Очевидно, нужно указывать что то типа -> ?
Но где, в каком месте раскрыть адрес?
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #10 : Июнь 09, 2015, 13:30 »

Нивапрос
Код:
TStructureTerrain struc;
struc.Matrix.~TSmallintSpaceXY(); // удаляем УЖЕ СОЗДАННЫЙ матрикс
new (&struc.Matrix) TSmallintSpaceXY(10,10); // создаем новый на его месте
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #11 : Июнь 09, 2015, 13:47 »

Крутяк  Веселый
А вызов деструктора - это безболезненно для данной ситуации?
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #12 : Июнь 09, 2015, 13:54 »

А какая разница? Главное, чтобы на момент вызова деструктора верхнего класса мембер был жив, иначе UB.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #13 : Июнь 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) {}
,,,
};
Записан
alik
Гость
« Ответ #14 : Июнь 09, 2015, 14:20 »

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

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

Теперь буду проверять по факту!)
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.229 секунд. Запросов: 23.