Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
10 / 10 / 3
Регистрация: 05.11.2010
Сообщений: 30

А можно ли такое делать?

09.11.2011, 22:45. Показов 1205. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Решил я закрепить свои знания по перегрузке операторов и написал свой класс стринга. Естественно я перегрузил оператор извлечения из потока.
Получилось следующие:
C++
1
2
3
4
5
6
7
8
std::istream& operator>>(std::istream& ins, String& st)
{
    if (st.len != -1) delete [] st.str;
    st.str = new char;
    ins >> st.str;
    st.len = strlen(st.str);
    return ins;
}
Меня смущает строка st.str = new char;. Я ж выделяю память под один символ, а потом поток сам расширят его, правильно? Корректно ли это?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
09.11.2011, 22:45
Ответы с готовыми решениями:

Можно ли на C++ делать что то для сайта?
Писать код на С++ , что бы он выполнял какой нить функционал для сайта? Собираюсь начать учить С++, вот думаю о будущем. Или только такое...

можно ли делать виртуальными перегружаемые операторы?
например так: virtual a& a::operator=(a& b);

Как можно делать скрины в авторежиме?
Как можно делать скрины в авторежиме, что б сохранялись автоматически в jpg в фоновом режиме. Про эмуляцию Print Screen знаю, подскажите в...

16
237 / 210 / 29
Регистрация: 08.06.2011
Сообщений: 467
09.11.2011, 22:47
Цитата Сообщение от Zyoma Посмотреть сообщение
Я ж выделяю память под один символ, а потом поток сам расширят его, правильно? Корректно ли это?
нет, на оба вопроса
0
10 / 10 / 3
Регистрация: 05.11.2010
Сообщений: 30
09.11.2011, 22:50  [ТС]
А подробнее?
0
237 / 210 / 29
Регистрация: 08.06.2011
Сообщений: 467
09.11.2011, 22:52
Цитата Сообщение от Zyoma Посмотреть сообщение
А подробнее?
вы выделяете память под один символ, "поток" ничего не расширяет
0
 Аватар для oxotnik
1665 / 1134 / 80
Регистрация: 21.08.2008
Сообщений: 4,734
Записей в блоге: 1
09.11.2011, 22:52
Цитата Сообщение от Zyoma Посмотреть сообщение
поток сам расширят его, правильно
а где это такое написано? откуда поток узнает на какой тип расширять?
0
10 / 10 / 3
Регистрация: 05.11.2010
Сообщений: 30
09.11.2011, 22:55  [ТС]
Но код работает. Я выделяю под один сивол, ввожу 10,20,30 символов, и он их воспринимает. Почему?

Добавлено через 1 минуту
и в str становится 10,20,30 символов. Как так?
0
 Аватар для oxotnik
1665 / 1134 / 80
Регистрация: 21.08.2008
Сообщений: 4,734
Записей в блоге: 1
09.11.2011, 22:56
Цитата Сообщение от Zyoma Посмотреть сообщение
Но код работает. Я выделяю под один сивол, ввожу 10,20,30 символов, и он их воспринимает. Почему?
потому что забиваешь невыделенную память, пока везет, что она не нужна никому, потом может пригодиться и будет ой
1
10 / 10 / 3
Регистрация: 05.11.2010
Сообщений: 30
09.11.2011, 22:58  [ТС]
А как тогда сделать правильно?
0
Заблокирован
09.11.2011, 23:05
Честно говоря, я вообще не вижу логики:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
std::istream& operator>>(std::istream& ins, String& st)
{
        if (st.len != -1)   //как длина вообще может быть отрицательным числом?
        {   
             delete [] st.str;    //нарушение инкапсуляции. 
                                       //Доступ к данным в обход интерфейса объекта
         }
         st.str = new char;   //вернётся указатель на один объект типа чар. 
                 //Если str должен указывать на строку, то это явный фейл
          ins >> st.str;
          st.len = strlen(st.str);
           return ins;
}
Ну а главное, я надеюсь вам хватило ума не включать функции взаимодействия между стримами и вашим классом в файлы самого класса?
0
10 / 10 / 3
Регистрация: 05.11.2010
Сообщений: 30
09.11.2011, 23:12  [ТС]
len = -1 когда строка пустая, совсем. причем тут нарушение инкапсуляции, если эта функция дружественная? А вам хватит ума написать как надо правильно, а не критиковать вещи совершенно не касающиеся темы?

Добавлено через 4 минуты
str - это указатель на char, причем тут указатель на строку?
0
Заблокирован
09.11.2011, 23:14
Цитата Сообщение от Zyoma Посмотреть сообщение
len = -1 когда строка пустая, совсем. причем тут нарушение инкапсуляции, если эта функция дружественная? А вам хватит ума написать как надо правильно, а не критиковать вещи совершенно не касающиеся темы?
Ну если строка пустая, значит количество символов, которое она содержит рано нуль. Логично?

Мне ума хватит. Я писал когда свой деццкий велосипед строк. Это было первое, что я сделал на с++.

Он у меня до сих пор лежит. Но это деццкий код. То есть сразу видно, что писал его ещё новичок)
Однако, таких вот откровенных ляпов и ошибок логики в нем конечно нет. Он полностью работоспособный.

Добавлено через 1 минуту
Цитата Сообщение от Zyoma Посмотреть сообщение
str - это указатель на char, причем тут указатель на строку?
Указатель на что? На символ чар? или на массив символов чар?

Сам язык не делает различие между указателем на объект, или на массив объектов. За этим следит программист. Его задача знать что это на самом деле - указатель на объект, или на массив. И соотвественно не встрять на этом.

Не написать delete ptr; там, где требуется delete[] ptr;
и тп
1
10 / 10 / 3
Регистрация: 05.11.2010
Сообщений: 30
09.11.2011, 23:16  [ТС]
конечно же вы не поделитесь своими деццкими разработками. Молоть языком очень прошу не в этой теме. Я обратился за помощью, а не за критикой тролля.
0
Эксперт С++
1069 / 848 / 60
Регистрация: 30.04.2011
Сообщений: 1,659
09.11.2011, 23:18
Zyoma, тут проблема с выделением памяти.
Тебе заранее неизвестно, сколько символов будет введено.
Поэтому в конструкторе твоего класса String нужно застолбить некий минимальный размер, например, 32 символа.
В функции ввода надо вводить посимвольно и считать символы.
Так как возможен ввод более 32 символов, то в кллассе надо предусмотреть приватную функцию resize(), которая должна делать следующее:
затребовать новый динамический массив
скопировать туда уже занятые символы
удалить старый массив
Сменить указатель на новый.
Размер нового динамического массива обычно в два раза больше текущего.
1
10 / 10 / 3
Регистрация: 05.11.2010
Сообщений: 30
09.11.2011, 23:21  [ТС]
Вот теперь я понял.
Спасибо огромное.
0
Заблокирован
09.11.2011, 23:23
Цитата Сообщение от Zyoma Посмотреть сообщение
конечно же вы не поделитесь своими деццкими разработками. Молоть языком очень прошу не в этой теме. Я обратился за помощью, а не за критикой тролля.
Я могу поделиццо своим деццким лесапедом. Мне не жалко. Если конечно, вы меня об этом вежливо попросите.

А что касается критики, то я вам указал на критические ошибки. Которые приведут к крушению.

Если вы выделяете память вот так: char ptr = new char;
То удалять её вы сможете только вот так: delete ptr; ptr=0;

Если вы выделяете память вот так: char ptr = new char [MAX];
То удалять её вы сможете только вот так: delete [] ptr; ptr=0;

То есть, правило простое: если выделял память под массив, то и удаляй тоже массив
Если выделял под объект, то и удаляй тоже объект.

Если попутаешь - потом прибежишь на этот форум и будишь спрашивать: почему у меня в рантайме лагает.

Потому что компилятор не различает указатель на массив, от указателя на объект.

А теперь смотри как ты создаёшь:

C++
1
st.str = new char;
и как удаляешь

C++
1
if (st.len != -1) delete [] st.str;

Это называется "порча памяти", и "неизвестное поведение".

Человеку говоришь: у тебя ошибка, мина замедленного действия. А он "аццтань, ты тролль!" Ну тупи дальше тогда.
1
10 / 10 / 3
Регистрация: 05.11.2010
Сообщений: 30
09.11.2011, 23:28  [ТС]
Все конечно хорошо, спасибо. Но я читал столько высокомерия в твоих указаниях об ошибках, что стало тошно.
0
10.11.2011, 00:14

Не по теме:

Цитата Сообщение от Zyoma Посмотреть сообщение
Все конечно хорошо, спасибо. Но я читал столько высокомерия в твоих указаниях об ошибках, что стало тошно.
Вы меня извините пожалуйста. Я совершенно не хотел вас ничем задеть.
Я думал вы для того и выложили код, что бы его покритиковали, и указали на ошибки и изъяны
Я не хотел показаться высокомерным.

1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
10.11.2011, 00:14
Помогаю со студенческими работами здесь

Можно ли делать шаблоны дружественных функций?
Вот пример того, как я хочу объявить дружественную функцию в классе: friend template <typename T> rational_fraction...

Можно ли считать такое решение верным
Напишите программу читающую со стандартного устройства ввода значения типа int и создающую из них вектор. Создайте массив того же размера,...

Такое и в правду можно сделать в консоли?

Кто-нибудь может подробно объяснить, что такое allocators, зачем это и что с ними делать? Нигде не нашёл инфы
Заранее спасибо.

с++ такое k, для которого можно построить множество
Помогите пожалуйста решить задачу с++!!! Задано семейство множеств букв. Найти такое k, для которого можно построить множество, состоящее...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Программный отбор элементов справочника Номенклатура по группе 1С
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор под наименованию группы (на. . .
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
Программный отбор элементов справочника Сотрудники по перечислениям 1С
Maks 21.03.2026
Установка программного отбора элементов справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит предопределенное значение перечислений. Процедура. . .
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru