Народ, помогите решить такую задачу. Дан массив символов типа 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. Народ плиз помогите разобраться с этим вопросом - очень нужно.
Приветствую Вас, 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; Как
компилятор может сделать такого рода преобразование и причем здесь конструкт
ор? Компилятор будет искать в классе подходящий для преобразования конструктор, так что ли?
Здравствуйте, 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.