Russian Qt Forum

Программирование => С/C++ => Тема начата: Torvald от Март 01, 2013, 22:11



Название: Списки инициализации, варнинг
Отправлено: Torvald от Март 01, 2013, 22:11
Код:
struct Point3d{
float x, y, z;
};

...

Point3d *vertex = new Point3d[n];
vertex[0] = {0, 0, 0}; //варнинг в этой строчке

...
Qt 4.8.2, kunutu 12.04 x64, возникает варнинг:
extended initializer lists only available with -std=c++0x or -std=gnu++0x [enabled by default]
Вопрос: как от него избавиться?


Название: Re: Списки инициализации, варнинг
Отправлено: Old от Март 01, 2013, 22:15
Вопрос: как от него избавиться?
Добавить к опциям компилятора -std=c++0x или не использовать списки инициализации, которые стали доступны в последнем стандарте.


Название: Re: Списки инициализации, варнинг
Отправлено: Igors от Март 02, 2013, 11:36
Проще и лучше добавить метод
Код
C++ (Qt)
struct Point3d {
void xyz( float _x = 0, float _y = 0,  float _z = 0 )  { x = _x; y = _y; z = _z; }
 
float x, y, z;
};


Название: Re: Списки инициализации, варнинг
Отправлено: GreatSnake от Март 02, 2013, 12:55
Проще и лучше добавить метод
Код
C++ (Qt)
struct Point3d {
void xyz( float _x = 0, float _y = 0,  float _z = 0 )  { x = _x; y = _y; z = _z; }
 
float x, y, z;
};

Наверное, проще всё-таки будет так:
Код
C++ (Qt)
struct Point3d {
Point3d() : x( 0 ), y( 0 ), z( 0 )  {}
float x, y, z;
};


Название: Re: Списки инициализации, варнинг
Отправлено: Old от Март 02, 2013, 13:13
Наверное, проще всё-таки будет так:
Хотим же просто (в смысле легко) устанавливать значения всех полей объекта в нужные значения (не обязательно нулевые).


Название: Re: Списки инициализации, варнинг
Отправлено: Igors от Март 02, 2013, 14:21
Наверное, проще всё-таки будет так:
Код
C++ (Qt)
struct Point3d {
Point3d() : x( 0 ), y( 0 ), z( 0 )  {}
float x, y, z;
};
Для данного конкретного класса это спорно. Напр возможна такая ситуевина
Код
C++ (Qt)
Point3d temp[1024];  // может тормозить именно за счет активного конструктора
 
Что хорошо в UI - не всегда хорошо для расчетов  :)


Название: Re: Списки инициализации, варнинг
Отправлено: Torvald от Март 03, 2013, 15:01
Код
C++ (Qt)
Point3d temp[1024];
 
Конструктор все равно не в этой строчке вызываться будет.

Всем спасибо за ответы. А ситуация была такая: я не хотел писать конструкторы вида Point3d() : x( 0 ), y( 0 ), z( 0 ) для каждой структуры, мне понравилась возможность списков инициализации, просто смущал варнинг. Воспользовался советом добавить к опциям компилятора -std=c++0x.


Название: Re: Списки инициализации, варнинг
Отправлено: Igors от Март 03, 2013, 16:08
Код
C++ (Qt)
Point3d temp[1024];
 
Конструктор все равно не в этой строчке вызываться будет.
Если перекрыт конструктор без параметров - в этой строчке он вызовется 1024 раза

А ситуация была такая: я не хотел писать конструкторы вида Point3d() : x( 0 ), y( 0 ), z( 0 ) для каждой структуры, мне понравилась возможность списков инициализации, просто смущал варнинг. Воспользовался советом добавить к опциям компилятора -std=c++0x.
Такие маленькие классы на первый взгляд кажутся совсем простыми. Однако с ростом проекта все становится не так очевидно. Напр неоднократно видел жаркие споры по поводу "а верно ли называть это "point"?  :)


Название: Re: Списки инициализации, варнинг
Отправлено: Torvald от Март 06, 2013, 10:45
Код
C++ (Qt)
Point3d temp[1024];
 
Конструктор все равно не в этой строчке вызываться будет.
Если перекрыт конструктор без параметров - в этой строчке он вызовется 1024 раза

А ситуация была такая: я не хотел писать конструкторы вида Point3d() : x( 0 ), y( 0 ), z( 0 ) для каждой структуры, мне понравилась возможность списков инициализации, просто смущал варнинг. Воспользовался советом добавить к опциям компилятора -std=c++0x.
Такие маленькие классы на первый взгляд кажутся совсем простыми. Однако с ростом проекта все становится не так очевидно. Напр неоднократно видел жаркие споры по поводу "а верно ли называть это "point"?  :)

Я обычно оставляю конструктор без параметров.
А на счет Point вы правы, часто нужно бывает воспользоваться тройкой x, y, z не как точкой в пространстве. Но это мой проект, в нем разработчик только я, и мне так удобнее :)