Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Инициализация в хедере 
:(
    Опции темы
libertas
Дата 21.6.2014, 13:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 10.3.2014

Репутация: нет
Всего: нет



Привет!

Подскажите, пожалуйста, можно ли в хедере инициализировать переменную

К примеру такой код не работает:

Код

class Figure{
private:
    QRect rect(0, 0, 10, 10);
public:
    QRect showRect();
};


Добавлено через 8 минут и 45 секунд
Вопрос закрыт. 

Так работает:

Код

class Figure{
private:
    QRect rect;
public:
    Figure() : rect(0, 0, 50, 50) {}
    QRect showRect();
};

PM   Вверх
Нэраварин
Дата 21.6.2014, 21:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 46
Регистрация: 9.3.2009

Репутация: нет
Всего: нет



Это НЕ хедер! Вы ошиблись в терминологии, обычно хедером называется заголовочный файл, например:
Код

#include <QRect>// где, QRect - хедер!

То, что написали вы называется  Композиция, когда класс(Figure) в своих элемент-данных содержит объект(rect) другого класса(QRect).
Чтобы инициализировать объект другого класса в элемент данных класса его содержащего нужно использовать специальный инициализатор элементов " : ", например:
Код

Figure() : rect( 100, 200, 11, 16 )
{
  //Тело можно оставить пустым, или на ваше усмотрение...
}




Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL   Вверх
CompWorm
Дата 24.6.2014, 23:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Допеределыватель
***


Профиль
Группа: Участник Клуба
Сообщений: 1689
Регистрация: 6.12.2004
Где: /

Репутация: нет
Всего: 31



ТС немного у другом спросил.
- нет, строго говоря незя. и тоже со статическими мемберама.
- нестрого говоря, можно smile через #define. но это мерзкий хак.

Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL   Вверх
NoviceF
Дата 25.6.2014, 08:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 313
Регистрация: 13.3.2012
Где: Ростов-на-Дону

Репутация: 2
Всего: 2



Цитата(libertas @  21.6.2014,  14:48 Найти цитируемый пост)
хедере

Хидер - это заголовочный файл, в вашем же случае, судя по всему, речь идёт об объявлении класса. Есди да, то в объявлении класса можно инициализировать только статические целочисленные константы (во всяком случае в старых плюсах, в новых вроде можно и float).


Цитата(CompWorm @  25.6.2014,  00:26 Найти цитируемый пост)
- нет, строго говоря незя. и тоже со статическими мемберама.

а как тогда назвать это? smile
Код

class A
{
public:
    static const int B = 10;
};

const int C = 20;

PM MAIL   Вверх
Нэраварин
Дата 25.6.2014, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 46
Регистрация: 9.3.2009

Репутация: нет
Всего: нет



Господа, что вы воду мутите?! тут же ясно всё написаннно!

Цитата (libertas )

   К примеру такой код не работает:
   

Код

class Figure{
private:
    QRect rect(0, 0, 10, 10);
public:
    QRect showRect();
};


И НЕ работает оно как раз таки потому, что так нельзя инициализировать объект rect таким способом! В Qt вылетит такая ошибка:
Код

expected identifier before numeric constant
    QRect r1(100, 200, 11, 16);
             ^
 
Снова внимательно перечитываем пост автора...О чём тут ещё может идти речь? кроме как не о неудавшейся инициализации? rect?!  Я вот например иных вариантов не вижу!

Соответственно объект rect нужно инициализировать с помощью инициализатора элементов ( двоеточие следующее после закрывающей круглой скобки конструктора и ДО фигурных скобок тела конструктора )

Код

//Конструктор
Figure() : rect( 0, 0, 10, 10 )//Двоеточие( : ) это и есть инициализатор элементов
{
  //Тело можно оставить пустым, или на ваше усмотрение...
}


Так же ещё потому, что у объекта-элемента(rect) создающегося в полях другого класса(Figure) может быть(а они есть) конструктор по умолчанию и set-функции, что добавляет накладные расходы и происходит "двойная инициализация" ! инициализатор элементов позволяет  избежать накладных расходов!

Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0595 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.