Часовой пояс: UTC + 3 часа




Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 1730 • Страница 9 из 87<  1 ... 6  7  8  9  10  11  12 ... 87  >
  Пред. тема | След. тема 
В случае проблем с отображением форума, отключите блокировщик рекламы
Автор Сообщение
 

Member
Статус: Не в сети
Регистрация: 14.01.2004
Откуда: Киев, Украина
Peter_P насчет второго примера, это описание конструктора класа со списком инициализации. Как известно, в момент вызова конструктора класса инициализируються все поля класса, мы можем явно указать, какими значениями инициализировать поля:
Цитата:
Heater :: Heater(Location 1)
Это описание коструктора classname::constructor, в С++ имя конструктора точно такое же как имя класса.
После двоеточия идет список инициализации:
Цитата:
: repLocation(1),
repIsOn(FALSE),
repPort(&SerialPort::ports[l]) {}
В С++ семантика каждого типа - это семантика объекта, т.е. как для типа repLocation(1) мы вызываем конструктор и тем самым инициализируем его, точно также иницаилизируем простую переменную repIsOn.

Цитата:
&SerialPort::ports[l]
Фактически получаем указатель на массив, который являеться статическим членом класса. Все статические члены и методы класса создаються во время старта программы и уничтожаються во время ее закрытий, еще не имеют указателя this (потому как существуют в независимости от созданого экземепляра класса). Доступ к ним возвожен так:
Цитата:
class::Method();

Цитата:
Heater::Heater() {}
Перегруженный конструктор.

И еще, тут видимо опечатка:
Цитата:
Heater :: Heater(Location 1)

Добавлено спустя 6 минут, 6 секунд
Цитата:
Второе - разве можно при определении класса ссылатся на него же (такая вот рекурсия)?
Почему бы и нет? Какая это рекурсия? Это не рекурсия, как по твоему списки объявляються? :-)
Код:
struct A
{
     A *Next;
}


Код:
Boolean Heater::is0n() const
Слово const после объявления метода класса значит лишь то, что этот метод не может изменить ни одного члена класса, кроме тех, которые объявлены как mutable, по типу
Код:
...
private:
  mutable int a;
...

Добавлено спустя 3 минуты, 27 секунд
PS вообще-то лучше читать стандарт, а не книгу там где показан плохой стиль программирования :-)

PPS если location это класс, то его лучше передавать не по значению, а по константной ссылке:
Код:
Heater :: Heater(const Location &l)

_________________
Ку ку



Партнер
 

Member
Статус: Не в сети
Регистрация: 04.02.2004
Откуда: Москва|СВАО
Daemon
Спасибо - более менее начал разбираться.
Эта книга не совсем про программирование - просто некие принципы автор комментирует кусками кода.

_________________
Счастье - это когда тебя понимают.
Разыскиваю (куплю) оригинальный USB-kit для Chaintech 5AGM2 (подробности в Л.С.).


 

Member
Статус: Не в сети
Регистрация: 25.11.2005
Откуда: краснодар
мишка писал(а):
int a[NN][NN];

помоему массив в DOS не может быть больше 64 килобайт а тут 200*200*4=160 кбайт
Добавлено спустя 3 минуты, 32 секунды
по первому пункту:
ты запускаеш прогу из среды программирования?
откуда прогу запустил то и есть её домашняя папка
и все файлы в етой папке можно читать по относительному пути
среда наверняка компилит файл куда-нить в projects-здесь и косяк

_________________
зри в корень(с) Козьма Прутков


 

Member
Статус: Не в сети
Регистрация: 07.02.2004
Откуда: Свердловская...
У меня вопрос.
Почему все мои проги (С++) под консоль занимают 1,2 Мб??? Юзаю Dev-C++. Когда писал на чистом Си все проги занимали не более 100 кб? Тоже в Dev-C++ было дело.
Как мне сделать размерчик то поменьше?

_________________
Если надпись на мониторе уменьшается, то ваш монитор уносят.


 

Member
Статус: Не в сети
Регистрация: 06.09.2005
Откуда: Москва
Лучшим выходом было бы выбрать другой компилятор. Лучше всего вообще писать под линукс, но если не хочется, то установить нормальную DE под венды. Имхо, в данный момент такой является VS2003 или 2005. Если и этого делать не хочется, то посмотреть в настройках твоей среды опции компилятора. В частности, убрать опции по отладке (debug), можно попытаться настроить проект так, чтобы исполняемый файл использовал DLL, не включая их в себя статически.


 

Member
Статус: Не в сети
Регистрация: 14.01.2004
Откуда: Киев, Украина
dimonpc2004 ты включаешь отладочный данные в ехе.

_________________
Ку ку


 

Member
Статус: Не в сети
Регистрация: 14.03.2004
Откуда: Москва
dimonpc2004 Заставит компилятор не включать неиспользуемы функции и переменные. заставить отключить динамическое определение типов, если ты ег оне используешь... Это как минимум

_________________
ФИЗТЕХ- рулез, ФАКИ - сила, Кванты тоже хорошо


 

Advanced member
Статус: Не в сети
Регистрация: 09.03.2004
Откуда: Кишинёв
В VC6 можно писать оконные проги размером от 2Килобайт :)


 

Member
Статус: Не в сети
Регистрация: 29.10.2003
Откуда: 埼玉、日本
Фото: 9
в VC8 тоже можно - он ничем не хуже


 

Member
Статус: Не в сети
Регистрация: 14.03.2004
Откуда: Москва
mein А в Linux и того меньше

_________________
ФИЗТЕХ- рулез, ФАКИ - сила, Кванты тоже хорошо


 

Member
Статус: Не в сети
Регистрация: 13.11.2004
Откуда: Новосибирск
Есть ли какая-то принципиальная разница в использовании new/delete и alloc/realloc/free? Почему функции alloc, realloc и free считают устаревшими и есть ли способ изменить размер динамически выделенной памяти не используя realloc?


 

Member
Статус: Не в сети
Регистрация: 14.01.2004
Откуда: Киев, Украина
qasz
Цитата:
Есть ли какая-то принципиальная разница в использовании new/delete и alloc/realloc/free?
Есть конечно. malloc/calloc просто выделяют память, но не ицициализируют объект ( не вызывают конструктор для не POD типов) и free/cfree не вызывают деструктор. new/delete выполняют. такие операции, operaton new и operator delete не выполняют.
Цитата:
способ изменить размер динамически выделенной памяти не используя realloc?
Нету, для этой цели нужно использовать контейнеры из STL.
Добавлено спустя 4 минуты, 19 секунд
Цитата:
Почему функции alloc, realloc и free считают устаревшими
Одну причину я уже назвал. Вторая - то, что использование realloc может нести серьезные накладные расходы, потому как realloc если не может изменить размер выделенной памяти - выделяет новую область требуемого размера и выполняет копирование, плюс по этому причине realloc может работать не корректно для не POD типов.

_________________
Ку ку


 

Member
Статус: Не в сети
Регистрация: 14.03.2004
Откуда: Москва
Daemon
Daemon писал(а):
работать не корректно для не POD типов.

побробнее можно, может я что-то не понял

qasz писал(а):
Почему функции alloc, realloc и free считают устаревшими

Это почему же. Вполне современый и по моему единственный способ(если уж в глуб библиотеки смотреть)

_________________
ФИЗТЕХ- рулез, ФАКИ - сила, Кванты тоже хорошо


 

Advanced member
Статус: Не в сети
Регистрация: 09.03.2004
Откуда: Кишинёв
почему не работает такое:
Код:
void xxx(wchar_t** x)
{
// ...
}
// ...
wchar_t buf[100][100];
xxx(buf)
// ...

VC говорит что не может конвертнуть 'wchar_t [100][100]' to 'wchar_t ** . Собственно почему и как мне поступить в таком случает, если надо передавать двумерный массив.


 

Member
Статус: Не в сети
Регистрация: 14.01.2004
Откуда: Киев, Украина
nickyoz
Цитата:
побробнее можно, может я что-то не понял
Потому как при копировании(если будет происходить копирование) realloc не будет вызывать конструкторов/деструкторов, в зависимости от того какие действия в них происходят realloc может работать, а может и не работать для твоего типа. И вообще копировать не POD типы с помощью memcpy строго не рекомендуют.
mein ну я думаю к этому времени ты и сам разобрался ;)
У тебя есть указатель на первый элемент. В ф-ции нужно передать указатель на указатель, так организуй :)
xxx(&buf[0]);
Если будет компилятор выпендриватся:
xxx(reinterpret_cast<wchar_t **>(&buf[0]));

_________________
Ку ку


 

Advanced member
Статус: Не в сети
Регистрация: 09.03.2004
Откуда: Кишинёв
Daemon ещё не разобрался :) .
Daemon писал(а):
xxx(&buf);
Если будет компилятор выпендриватся:
xxx(reinterpret_cast<wchar_t **>(&buf));

Оно, то, компилируется, но не работает - неправильно доходит указатель.


 

Member
Статус: Не в сети
Регистрация: 14.01.2004
Откуда: Киев, Украина
Что-то неработает корректно, при попытке обращения к элементу происходит ошибка :-(
Два выхода или объявляй в программе не двумерный массив, а wchar_t **buf; или передавай массивы как рекомендует стандарт void xxx(wchar_t x[][100])
Добавлено спустя 1 минуту, 17 секунд
Или используй vector :)
Добавлено спустя 3 минуты, 4 секунды
mein писал(а):
не работает - неправильно доходит указатель.

Тогда посмотри вывод:
Код:
void xxx(wchar_t **x)
{
   std::cout << x << std::endl;
}


int _tmain(int argc, _TCHAR* argv[])
{
   wchar_t buf[100][100];

   std::cout << buf << std::endl;
   xxx(reinterpret_cast<wchar_t **>(&buf[0]));
   return 0;
}


И как оно еще не работает :) Тут другая причина.

_________________
Ку ку


 

Member
Статус: Не в сети
Регистрация: 14.03.2004
Откуда: Москва
Daemon А. Ну это да. Применение этих функций к объектам более сложной природы, чем заложено в чистом С конечно недопустимо.

_________________
ФИЗТЕХ- рулез, ФАКИ - сила, Кванты тоже хорошо


 

Advanced member
Статус: Не в сети
Регистрация: 09.03.2004
Откуда: Кишинёв
Daemon
пока сделал через xxx(wchar_t x[][100]) - работает, но выглядит страшно. vector для такой простой ситуации не охота юзать.
а вот из примера я высмотрел другую весчь:
Код:
int _tmain(int argc, _TCHAR* argv[])

А именно параметр argv . Это как понимать :) ?


 

Member
Статус: Не в сети
Регистрация: 14.01.2004
Откуда: Киев, Украина
mein
Цитата:
А именно параметр argv . Это как понимать ?
Ну это массив указателей на char или wchar_t так передается (массив строк короче) :) В С унарные операторы справа на лево интерпритируются.

_________________
Ку ку


Показать сообщения за:  Поле сортировки  
Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 1730 • Страница 9 из 87<  1 ... 6  7  8  9  10  11  12 ... 87  >
-

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB | Kolobok smiles © Aiwan