Здравствуйте уважаемые эксперты. Недавно я начал программировать на С++ в "Microsoft Visual C++ 7 .NET". У меня к вам два вопроса: 1) Если что-либо объявить в H файле и включить этот файл в несколько CPP файлов, то линкер начинает ругаться, что мол то-то, то-то и то-то уже объявлено. Как с этим справится. #pragma once и #ifndef module_h #define module_h //Код #endif не помогают. 2)Я начал делать класс String (исходник прилагается), но столкнулся с проблемой: странно работает перегруженный оператор "operator+". При попытке использовать его сначала происходит много "User Breakpoint", которых собственно User нигде не делал, затем "Debug assertion failed" (несколько штук), после этого программа работает нормально (строки складываются). При закрытии программы всё повторяется и заканчивается
виндосовским сообщением об ошибке. Ничего не могу понять. Помогите пожалуйста!!!!
Приветствую Вас, Иван! 1. Это происходит потому, что Вы пишете в заголовках не _объявления_, а _определения_ переменных/функций. Например: объявления: extern int a; void f(); определения: int a; void f() {} 2. Навскидку несколько ошибок: a) String(int sz) new не инициализирует выделяемую память, поэтому в выделенной строке - мусор, и она не заканчивается нулем b) operator=(const char s) аналогично - строка не заканчивается нулем c) operator+(String& str) и другие непонятные действия: 1) выделяем память под суммарную строку + 0 + лишний байт и запоминаем в s 2) добавляем к памяти по адресу Data данные второй строки (ошибка - память под эти данные там мы не выделяли) и запоминаем в s адрес Data. 3) создаем на стеке строку из s 4) удаляем s (ошибка - надо delete[] и вообще, фактически
мы удаляем данные Data). Совет: 1. Почитайте внимательней, что делает функция strcat 2. При удалении динамической памяти оператором delete не обязательно проверяться на NULL, это заложено в стандарте C++. С уважением, Avl2k.
Ответ отправлен: 17.02.2004, 17:56 Отправитель: Avl2k Отвечает Morgion
Добрый день, Иван! 1) Если линкер так ругается, значит на самом деле что-то уже объявлено- попробуй для своих класов/функций/данных использовать другие имена. 2) Не вникал в код, но ошибки сразу видны- массив неправильно удалаеш- не delete mass; а delete []mass;- это синтаксис удаления массива. Мой тебе совет- не используй друзей- лучше явное преобразование типа из char* в String Ответ отправлен: 17.02.2004, 13:11 Отправитель: Morgion
Вопрос № 1447
Здравствуйте. Есть переменная float Tem. Как мне проинтерпретировать её как longint или массив из 2-х элементов int или массив из 4-х элементов short int(желательно все случаи). Аналогичная проблема если переменая задана динамически float *Tem = new float. Заранее СПАСИБО.
Доброе время суток, Алексей! Ну например вот так:): float Tem = 1213; long int x = Tem - 1200; // x = 13 long int y = Tem - 1201; // y = 12 --- Какой вопрос, такой ответ:)! Ответ отправлен: 17.02.2004, 19:07 Отправитель: Бездомный Отвечает Morgion
Добрый день, Алексей! Можно либо использовать union либо преобразовывать указатели. См. прил.
Приложение: Ответ отправлен: 17.02.2004, 13:21 Отправитель: Morgion Отвечает vitya
Добрый день, Алексей! long l = *(long *)&Tem; int i[2]; memcpy(i, &Tem, sizeof(Tem)); short int даже под дос 2 байта. Ответ отправлен: 18.02.2004, 11:40 Отправитель: vitya
Форма отправки вопроса
Внимание!
Мы рекомендуем открывать рассылку в программе Internet Explorer 5.0+
или отправлять вопросы с сайта по адресу:
http://rusfaq.ru/cgi-bin/Message.cgi.