|
|
|
вопрос по С++
|
|||
|---|---|---|---|
|
#18+
изучаю основы C++ написал такой класс , он работает Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. есть 2 вопроса: 1. как бы мне так сделать , чтоб помимо метода assign я мог написать просто Код: plaintext 1. 2. 3. 2. Как тут смотрится ф-ия realloc в методе concat? это я в стиле C сделал, может быть в C++ можно переопределить память покрасивее? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.06.2005, 09:24 |
|
||
|
вопрос по С++
|
|||
|---|---|---|---|
|
#18+
за realloc нескажу а вот про первый вопрос типа так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.06.2005, 09:42 |
|
||
|
вопрос по С++
|
|||
|---|---|---|---|
|
#18+
точно, спасибо это оказывается называется перегрузка оператора ( до него я еще недошел :) только пришлось немного подправить Код: plaintext 1. 2. 3. 4. а у вас с char работает ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.06.2005, 10:01 |
|
||
|
вопрос по С++
|
|||
|---|---|---|---|
|
#18+
alex_k string& operator=(const char& str) // должно быть string& operator=(const string& str) { здесь можно просто вызвать assign. И сделать сам operator= inline } В общем, лучше сам напишу. Выгдядеть должно так : Код: plaintext 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.06.2005, 10:03 |
|
||
|
вопрос по С++
|
|||
|---|---|---|---|
|
#18+
да не :-) это я опечатался :-) сначала думал написать char* а потом решил как у тебя assign сделать, вот и сделал что-то среднее :-) ты, к стати, сделай еще и operator=(const char*) пригодится :-) надеюсь это все в образовательных целях? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.06.2005, 10:04 |
|
||
|
вопрос по С++
|
|||
|---|---|---|---|
|
#18+
2MasterZiv действительно :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.06.2005, 10:05 |
|
||
|
вопрос по С++
|
|||
|---|---|---|---|
|
#18+
В concat тоже хорошо бы проверять if( this != &str ). realloc применять нельзя здесь - просто будет ошибка. Либо везде пользуйся new/delete, либо везде malloc/realloc/free. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.06.2005, 10:06 |
|
||
|
вопрос по С++
|
|||
|---|---|---|---|
|
#18+
2. Как тут смотрится ф-ия realloc в методе concat? это я в стиле C сделал, может быть в C++ можно переопределить память покрасивее? Ммм..., а что значит покрасивее. Сначала изучи основы, потом будешь покрасивее писать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.06.2005, 10:08 |
|
||
|
вопрос по С++
|
|||
|---|---|---|---|
|
#18+
alex_kнадеюсь это все в образовательных целях? пока то да :) авторrealloc применять нельзя здесь - просто будет ошибка а ошибка какого плана? просто так то это ведь работает, хотя фиг знает в дейст. оно переопределяет или нет ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.06.2005, 10:18 |
|
||
|
вопрос по С++
|
|||
|---|---|---|---|
|
#18+
alex_kк стати, сделай еще и operator=(const char*) а это зачем? присвоение и так идет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.06.2005, 10:21 |
|
||
|
вопрос по С++
|
|||
|---|---|---|---|
|
#18+
sanek842 alex_kк стати, сделай еще и operator=(const char*) а это зачем? присвоение и так идет я может глупость сморозил, но как будет происходить преобразование "sometext" который суть char* ? может я просто недогоняю? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.06.2005, 11:38 |
|
||
|
вопрос по С++
|
|||
|---|---|---|---|
|
#18+
честно говоря я тоже недогоняю, но это работает я с успехом заменил Код: plaintext Код: plaintext мало того , заметь метод concat тоже описан только как Код: plaintext Код: plaintext 1. тоже несовсем понятно :) ( это пример с книжки , просто я его начал модифицировать ... ) to MasterZiv можно немного пояснить вашу мысль про inline ( что то неуловил :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.06.2005, 11:55 |
|
||
|
вопрос по С++
|
|||
|---|---|---|---|
|
#18+
да , тут еще обнаружилась некорректность с realloc вот нов. вариант с учетом замечания MasterZiv Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. а почему realloc нельзя исп. в свяке new так и непонятно, может всетаки можно? И чем ( изнутри ) new от malloc отличается? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.06.2005, 12:28 |
|
||
|
вопрос по С++
|
|||
|---|---|---|---|
|
#18+
sanek842а почему realloc нельзя исп. в свяке new так и непонятно, может всетаки можно? И чем ( изнутри ) new от malloc отличается? Malloc выделяет столько памяти, сколько запросил программист; new - больше . При этом, размер памяти, доступной для записи данных одинаков при использовании данных функций. Просто в блоке памяти, выделяемом по new, присутствует некоторая служебная информация (если не ошибаюсь, длина выделенного блока). Эта служебная информация используется в delete... А теперь представь, что ты выделил память по new (со служебной информацией), а потом сделал realloc. Таким образом, ты изменил длину выделенного блока не уведомив при этом "службу безопасности". При попытке очистить выделенную память при помощи delete ты рискуешь либо оставить "мусор", либо, что еще хуже, испортить данные... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.06.2005, 13:17 |
|
||
|
вопрос по С++
|
|||
|---|---|---|---|
|
#18+
похоже вы правы, почитал еще тут и вцелом по поиску я наверное был неправ :) наткнулся еще на такую ссылку где говорят что malloc+realloc на базовых типах отруливает быстрее, чем мутить с new , наверное переделаю , new уберу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.06.2005, 14:56 |
|
||
|
вопрос по С++
|
|||
|---|---|---|---|
|
#18+
sanek842 alex_kк стати, сделай еще и operator=(const char*) а это зачем? присвоение и так идет Если хочешь сделать специфический метод присваивания без создания промежуточного временного объекта. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.06.2005, 00:10 |
|
||
|
вопрос по С++
|
|||
|---|---|---|---|
|
#18+
sanek842>честно говоря я тоже недогоняю, но это работает я с успехом заменил Создается компилятором временный объект путем вызова конструктора от строки. sanek842> можно немного пояснить вашу мысль про inline ( что то неуловил :) Ну есть такой подход к переопределению операций (один из возможных). Делать для каждой операции соответствующий метод (например, для = - assign, как у тебя), а потом сами операции делать inline и в них только перевызывать соотв. операцию. В этом случае пользователь имеет возможность использовать как функциональную нотацию, так и операторную. И нет накладных расходов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.06.2005, 00:35 |
|
||
|
вопрос по С++
|
|||
|---|---|---|---|
|
#18+
Станислав C. sanek842а почему realloc нельзя исп. в свяке new так и непонятно, может всетаки можно? И чем ( изнутри ) new от malloc отличается? Malloc выделяет столько памяти, сколько запросил программист; new - больше . При этом, размер памяти, доступной для записи данных одинаков при использовании данных функций. Просто в блоке памяти, выделяемом по new, присутствует некоторая служебная информация (если не ошибаюсь, длина выделенного блока). Да она и в том блоке, который выделяет malloc, присутствует. Дело не в этом. Нельзя - потому что нельзя. Потому что Станислав C. Эта служебная информация используется в delete... Станислав C. А теперь представь, что ты выделил память по new (со служебной информацией), а потом сделал realloc. Таким образом, ты изменил длину выделенного блока не уведомив при этом "службу безопасности". При попытке очистить выделенную память при помощи delete ты рискуешь либо оставить "мусор", либо, что еще хуже, испортить данные... Ну короче мысли идеологически правильные, но фактически неверные - обычно в RTTI new/delete используют malloc/free , а вот уже они все разборки с размерами блоков делают. т.е. heap делают один для С++ и С. Но - все равно нельзя. Потому что : Нельзя по стандарту Нельзя по сути - ты не знаешь, как работает new, он может быть переопределен и вообще не так работать В С++ вообще нет перераспределения памяти. Потому что надо вызывать деструкторы и конструкторы. И, кроме того, это просто не нужно - нужны тебе realloc - используй malloc вместо new. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.06.2005, 00:44 |
|
||
|
вопрос по С++
|
|||
|---|---|---|---|
|
#18+
По поводу >>естно говоря я тоже недогоняю, но это работает >>я с успехом заменил >>b.assign("World"); >>на >> >> >>b="World"; Естественно, что работает Просто неявно вызывается что-то вроде string(char*const) т.е. точно так же, как string str = "my string"; т.е. реально b.assign(string("World")); b = string("world"); если хочешь запретить - используй "explicit" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2005, 01:55 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=33139906&tid=2033015]: |
0ms |
get settings: |
7ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
51ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
54ms |
get tp. blocked users: |
2ms |
| others: | 222ms |
| total: | 367ms |

| 0 / 0 |
