Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Программирование на C / C++


Информационный Канал Subscribe.Ru

RusFAQ.ru: Программирование на C / C++

Выпуск № 633
от 26.11.2004, 12:50

Администратор:
Имя: Nick.Box
URL: Информационный ресурс
ICQ: 365124
[censored], [censored]
О рассылке:
Задано вопросов: 2047
Отправлено ответов: 3890
Активность: 190.0 %
[Задать вопрос >>][Регистрация эксперта >>]
[Поиск в базе][Обсудить на форуме]


 Список экспертов, ответы которых опубликованы в данном выпуске

vitaly
Статус: Доверительный
Общий рейтинг: 129.23
[Подробней >>]
CrackLab
Статус: Опытный
Общий рейтинг: 114.01
[Подробней >>]
vitya
Статус: Профессиональный
Общий рейтинг: 109.92
[Подробней >>]
 
DSota
Статус: Опытный
Общий рейтинг: 122.68
[Подробней >>]


 Краткий перечень вопросов

Вопрос № 2038. Народ, помогите решить такую задачу. Дан массив символов типа char требуется перевести его в long double с точностью до 2-х знаков после запятой. А также обратный перевод, т.е. long double в массив типа char. Т.е. пусть пользователь введет например $... (ответов: 1)
Вопрос № 2039. Здравствуйте! 1.Меня интересует работа виртуальных функций. Почему возможен указатель вида ParentObj * ptr=new ChildObjVar; т.е. почему можно ссылаться указателю типа родит.класса на объект дочернего класса, ведь они могут быть разного размера? Ес... (ответов: 4)

Вопросов: 2, ответов: 5


 Вопрос № 2038

Народ, помогите решить такую задачу.
Дан массив символов типа char требуется перевести его в long double с точностью до 2-х знаков после запятой. А также обратный перевод, т.е. long double в массив типа char.
Т.е. пусть пользователь введет например $ 1 234 567 890 123.00 а преобразуется все это в 1234567890123.00, и присвоется переменной типа long double. также пусть он введет например 1234567890123.00 в переменную long double а прога преобразует его к виду $ 1 234 567 890 123.00 и присвоет массиву char.
Читал что для преобразования char - long double есть ф-ия _atold, то MVC++ 6.0 пишет, что error C2065: '_atold' : undeclared identifier, для подключения ф-ия необходимо использовать библиотеку stdlib.h или math.h. Народ плиз помогите разобраться с этим вопросом - очень нужно.



Вопрос отправлен: 22.11.2004, 18:08
Отправитель: codevektor (codevektor@yandex.ru)

[Следующий вопрос >>] [Список вопросов]

Отвечает vitaly

Приветствую Вас, codevektor!
В MSDN написано что если писать для Win32 то функция atof
вполне подойдёт
_atold нужна для совместимомти и не может быть использована в Win32

Ответ отправлен: 23.11.2004, 10:20
Отправитель: vitaly


 Вопрос № 2039

Здравствуйте!
1.Меня интересует работа виртуальных функций.
Почему возможен указатель вида
ParentObj * ptr=new ChildObjVar;
т.е. почему можно ссылаться указателю типа родит.класса на
объект дочернего класса, ведь они могут быть разного размера?
Если можно расскажите как работают виртуальные функции подробнее, а
то я застрял на них.
2.Почему сделав объявление
char * simvols[10];
затем можно сделать так
simvols[1]='D';
или так simvols="Hello"? Ведь simvols это массив указателей.
3.Еще один мой вопрос касается преобразования типов. Почему не используется
оператор разыменования?
Если в классе объявлен конструктор к примеру
class Counter{
public:
counter(int val);
......
......
private:
int itsval;
};
то почему можно сделать так
int theShort=5;
Counter theCtr=theShort;
Как компилятор может сделать такого рода преобразование и причем здесь конструкт ор?
Компилятор будет искать в классе подходящий для преобразования конструктор, так что ли?



Вопрос отправлен: 23.11.2004, 12:46
Отправитель: Alex

[Следующий вопрос >>] [Список вопросов]

Отвечает CrackLab

Здравствуйте, Alex!
1) Такое объявление как вынаписали - некорректно. Точнее компилятор скомпилирует программу, но зачем так делать?
Вот что произойдет когда вы пишете ParentObj * ptr=new ChildObjVar; Программа выделит в памяти место под объект типа ChildObjVar, и в выделенном месте создаст объект типа ParentObj. Соотвественно если дочерний объект имеет дополнительные члены, то часть выделенного места будет пропадать зря. Т.к. объект ptr - указатель на объект класса ParentObj - то независимо от того что вы используете оператор new с указанием дочернего класса, нельзя будет обращаться к членам дочернего класса через ptr->. Так же при удалении объекта ptr будет вызван только деструктор родительского класса, который СКОРЕЕ ВСЕГО (точно я не смотрел) освободит место размером с объект родительского класса, несмотря на то, что места было выделено размером с объект дочернего класса. Т.е. это приведет к небольшим потерям памяти. По поводу виртуальных фун кции - при таком объявлении не будут вызваны вирт. фукнции дочернего класса, а будут вызваны вирт. функции базового класса. Т.е. если оба класса имеют вирт. функцию calc(), то ptr->calc() приведет к вызову функции calc() родительского класса.
Для нормальной работы пишите либо ParentObj * ptr=new ParentObj; либо ChildObjVar * ptr = new ChildObjVar;
2) Возможно у вас нестандартный компилятор. Я проверил на компиляторе MS VC++ .NET (v7.1), и он не позволил скомпилировать такой код.
3) Запись вида Counter theCtr = theShort; - это то же самое что и Counter theCtr(theShort);

Ответ отправлен: 23.11.2004, 16:21
Отправитель: CrackLab


Отвечает vitya

Здравствуйте, Alex!
1. в этом суть открытого наследования. Все дети, есть родители. Но не обратно. При наследовании базовый класс всегда находится в начале памяти, поэтому указатель на дочерний автоматом указывает на дочерний. Это не верно при множественном наследовании, ну для этого есть спец оператор static_cast
2. испольуйте стд::стринг. simvols="Hello" - плохой вкус. Никогда так не делай. "Хелло" это const char *, а не char *
3. да будет искать подходяший конструктор. можно запретить подбные преобразования описав все конструкторы explicit

Ответ отправлен: 26.11.2004, 09:29
Отправитель: vitya


Отвечает vitaly

Приветствую Вас, Alex!
1.
ParentObj * ptr=new ChildObjVar; - Это называется полиморфизм в ООП. (размер здесь не причём)
Как работают виртуальные функции тебе лучше прочитать в книге по C++ или по ООП.
2.
char * simvols[10];
На такое - simvols[1]='D'; и такое - simvols="Hello"; компилятор MEcrosoft ругается.
Когда объявляешь массив указателей лучше инициализировать сразу . Если не сразу то потом выделять память динамически.
Напр.
simvols[1] = new char[5];
3.
Да , так.


Ответ отправлен: 23.11.2004, 15:56
Отправитель: vitaly


Отвечает DSota

Здравствуйте, Alex!
1. А размер здесь ни при чем, NEW создал дочерний обьект и выделил для него память. А указатель как был 4(8) байт так и остался... А то, что типы указателей разные - можно будет использовать только функции, описанные в ParentObj. Виртуальная функция - это функция, которая вызываеться по ссылке на нее, т. е. ее можно менять во время работы.
2. Так сделать нельзя (может быть компилятор хитрит?)
3. А это конструктор так можно вызывать. Да, будет искать.

Ответ отправлен: 24.11.2004, 09:25
Отправитель: DSota



Форма отправки вопроса

Внимание!
Мы рекомендуем открывать рассылку в программе Internet Explorer 5.0+ или отправлять вопросы с сайта по адресу: http://rusfaq.ru/cgi-bin/Message.cgi.

(C) 2002-2003 Команда RusFAQ.ru.

 Персональные данные

Ваше имя:

Ваш e-mail:

Опубликовать мой e-mail в рассылке


 Вопрос и дополнение

Ваш вопрос:


Приложение (если необходимо):


Получить ответов:


 Выбор рассылки

Программисту
Assembler (20)
C / C++ (18)
Perl (4)
Builder / Delphi (18)
Pascal (18)
Basic / VBA (9)
Java / JavaScript (5)
PHP (16)
Криптография (6)
WinAPI (18)
Радиоэлектроника (12)
Пользователю
Windows 95/98/Me (39)
Windows NT/2000/XP (59)
"Железо" (38)
Поиск информации (20)
Администратору
Windows NT/2000/XP (34)
Linux / Unix (17)
Юристу
Гражданское право (10)
Семейное право (5)
Трудовое право (8)
КоАП (5)

Отправить вопрос всем экспертам выбранной рассылки.





http://subscribe.ru/
http://subscribe.ru/feedback/
Подписан адрес:
Код этой рассылки: comp.soft.prog.cplus
Отписаться

В избранное