Форум программистов, компьютерный форум CyberForum.ru

Класс строк с различными функциями - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Как сделать константными значения "m" и "n" http://www.cyberforum.ru/cpp-beginners/thread535543.html
не знаю как сделать константными значения "m" и "n" так как я создал динамический массив и ввожу эти значения с клавиатуры. подскажите как решить эту задачу #include <iostream> using namespace std; void main() { int n; int m; cout<<"VVedite koli4estvo strok i stolbcov 4erez ENTER: "; cin>>n>>m;
C++ Реакция на нажатие клавиш (вверх, вниз, влево, вправо) Как сделать, что бы программа откликалась на кнопки вверх, вниз, влево, вправо. // Движок для игры AA - All Action // Вложения #include <iostream.h> // Классы class machine // Автомобиль и его координаты { public: float X; http://www.cyberforum.ru/cpp-beginners/thread535532.html
Если макрос на VBA переписать на С++, то макрос станет работать быстрее? C++
Всем привет!) У меня есть макрос написанный в Екселе на VBA, если его переписать на С++ , то макрос станет работать быстрее? Добавлено через 15 часов 39 минут Ответьте пожалуйста
C++ Поиск символов в строке
Есть строка в файле txt, как организовать поиск наиболее часто повторяющегося символа в строке ?
C++ Инициализация вектора структур http://www.cyberforum.ru/cpp-beginners/thread535515.html
Не могу инициализировать вектор. struct cmd{ QString name; qint16 code; }; QVector <cmd> commands={ "movl",0x8B,
C++ Помогите скомпилировать прогу. Функция OpenThread. вот диспетчер процессов, не работает функция OpenThread(вылетает ошибка), для компиляции проекта мен потребовалось вставить своё описание и вщять чужую либу kernel32.lib(может проблемма в этом) поробуйте запустить у себя это код. #include "stdafx.h" #include <cstdlib> #include <iostream> #include "windows.h" #include "winbase.h" #include <TlHelp32.h> подробнее

Показать сообщение отдельно
villu
202 / 202 / 4
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
01.04.2012, 18:32     Класс строк с различными функциями
Amy_lee, смотри какое дело:
вызов new может кинуть исключение и в случае если это произойдет тут
C++
1
2
3
    delete [] str;
    length = s.length;
    str = new char [length+1];
У нас получится "сломанный" объект. То есть: у нас будет новая длина, но значение указателя СТАРОЕ, поскольку new кинул исключение и значение str не изменилось. И более того, оно уже удалено, то есть str у нас указывает вникуда.
Лечится это либо выделение памяти сначала и в случае успаха присваиванием нового значения:
C++
1
2
3
    char *tmp = new char [s.length + 1]; // выделили
    delete [] str; // удалили. delete исключениями не кидается
    str = tmp; // сменили, все хорошо
Со swap это есть такой распространенный прием. Дело в том, что swap не кидает исключений (обычно) потому что сделан так, что просто меняет значения указателей у двух объектов местами.
C++
1
2
3
4
5
6
7
8
9
10
11
void mystr::swap(mystr& other) /*throw()*/ {
    // поменяли указатели местами
    char *tmp = other.str;
    other.str = str;
    str = tmp;
 
    // поменяли размеры местами
    int tlen = other.length;
    other.length = length;
    length = tlen
}
функция гарантированно не кинет исключений
далее мы делаем так:

Создаем новый объект
меняемся с ним указателями
возвращаем ссылку на себя
C++
1
2
3
4
5
{
    mystr tmp(s); // может кинуть исключение, но при этом мы не сломаем this 
    swap(tmp);    // безопасно, мы ничего не сломаем
    return *this;   // ну понятно
}  // тут будет вызван деструктор объекта tmp, который подчистит старую память
В довесок новый объект tmp САМ очищает за собой память в деструкторе.
Советую запомнить этот прием
 
Текущее время: 00:33. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru