Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
1 / 1 / 0
Регистрация: 08.07.2012
Сообщений: 83
1

Как проинициализировать структурную переменную в конструкторе класса?

02.07.2014, 20:34. Показов 1105. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
К примеру у меня есть переменная p типа POINT. Такую запись он считает нелегальной:
C++
1
2
3
4
5
private:
    POINT p;
public:
    MyClass() : p.X(0), p.y(0)
    {}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.07.2014, 20:34
Ответы с готовыми решениями:

проинициализировать строку в конструкторе
Привет. Помогите, пожалуйста разобраться со строками. что с ними делать в конструкторе, функции,...

Как повторно проинициализировать переменную конструктором?
Создал в классе переменную и проинициализировал ее в конструкторе. class A { int var; ...

Как проинициализировать static поле класса?
Добрый вечер. Как проинициализировать в конструкторе b() подобную переменную? В данном примере...

Как вызвать виртуальную функцию из дочернего класса, если она определена и вызывается в конструкторе РОДИТЕЛЬСКОГО класса?
Ну то есть так: есть родительский и дочерний класс, в родительском определен виртуальная функция и...

8
34 / 34 / 21
Регистрация: 02.02.2012
Сообщений: 181
02.07.2014, 20:54 2
C++
1
2
3
4
5
6
7
8
9
10
11
class A
{
private:
    point p;
public:
    A()
    {
        p.x = 0;
        p.y = 0;
    }
};
0
6 / 6 / 1
Регистрация: 31.08.2012
Сообщений: 230
02.07.2014, 20:55 3
Может быть стоит сначала вызвать конструктор типа POINT, а затем уже вызывать конструктор MyClass ?
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
02.07.2014, 21:01 4
Цитата Сообщение от Greeezly Посмотреть сообщение
Может быть стоит сначала вызвать конструктор типа POINT, а затем уже вызывать конструктор MyClass ?
Конструктор POINT вызывается автоматически, т.к. объект этого типа является полем класса.
Другое дело - ЧТО есть в этом конструкторе POINT. Может он вообще сгенерирован по умолчанию, т.е. не происходит никакой инициализации полей.
Если POINT это обычная структура, то достаточно самого простого варианта:
C++
1
MyClass() { p.x=0; p.y=0; }
0
383 / 281 / 31
Регистрация: 04.09.2009
Сообщений: 1,225
02.07.2014, 21:16 5
007imran007,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
struct Point {
    int x,y;
 
};
 
class A {
    Point point;
public:
    A() : point {3,4}
    {
        std::cout << "Success!\n";
    }
};
int main() {
    A a;
    return 0;
}
Добавлено через 1 минуту
Цитата Сообщение от Tulosba Посмотреть сообщение
MyClass() { p.x=0; p.y=0; }
И все же это уже присваивание, а не инициализация, если не ошибаюсь. Ведь в теле конструктора класса, конструкторы всех его полей УЖЕ вызваны и проработали.
1
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
02.07.2014, 21:20 6
Цитата Сообщение от gromo Посмотреть сообщение
И все же это уже присваивание, а не инициализация, если не ошибаюсь.
В данном случае вообще никакой разницы, т.к. у структуры нет явного конструктора, а ее поля это обычные int'ы.
0
18896 / 9854 / 2410
Регистрация: 30.01.2014
Сообщений: 17,297
02.07.2014, 21:56 7
gromo, с точки зрения С++11 твой вариант с uniform initialization самый правильный.
В более ранних версиях два варианта, либо, если это возможно, делаем в Point конструктор, либо используем вариант с присваиванием, т.к. для POD действительно нет никакой разницы.

Добавлено через 8 минут
Если просто нужны нули, то достаточно сделать так:
C++
1
2
3
4
5
6
7
8
class A
{
public:
    A() : p()  {}
 
private:
    Point p;
};
1
1 / 1 / 0
Регистрация: 08.07.2012
Сообщений: 83
03.07.2014, 09:59  [ТС] 8
Отказывается от вашего варианта...не могу понять почему

Добавлено через 16 минут
но принимает присваивание: { p.x = 0; p.y = 0; } и не до конца понял, почему мой вариант (который всегда работал и как я читал является абсолютной копией вышенаписанного) не работает:
C++
1
2
A() : p.x(0), p.y(0)
{}
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
03.07.2014, 10:58 9
Цитата Сообщение от 007imran007 Посмотреть сообщение
Отказывается от вашего варианта...не могу понять почему
Вероятная причина:
extended initializer lists only available with -std=c++11 or -std=gnu++11
Цитата Сообщение от 007imran007 Посмотреть сообщение
который всегда работал и как я читал является абсолютной копией вышенаписанного
На счет работоспособности Вашего варианта Вы заблуждаетесь.
0
03.07.2014, 10:58
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.07.2014, 10:58
Помогаю со студенческими работами здесь

Инициализация шаблонного класса(В конструкторе класса после двоеточия вновь имя класса)
Всем доброго времени суток! Пытаюсь разобраться как работает приведенный мной код. Конкретно,...

Сколько памяти выделяется под структурную переменную
Подскажите, пожалуйста. Сколько памяти выделяется под структурную переменную типа cell? struct...

Как задать размер матрицы в конструкторе класса?
Подскажите как задать размер матрицы в конструкторе класса? Решаю задачи из учебника, не могу...

Как инициализровать константное поле класса в конструкторе?
Здравствуйте. Такая проблема. Класс работает с множеством картинок одинакового разрешения. Размеры...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru