|
|
|
Меняются поля класса, хотя и не должны
|
|||
|---|---|---|---|
|
#18+
Имеется простенький класс описывающий полином (хедер и реализация - в аттаче). Устроен просто: поле power хранит степень полинома, массив koefs хранит коеффициенты (от младшей степени - 0 - к старшей), плюс имеется несколько перегруженных операторов. Написал малюсенькую прожку, текстирующую это дело: Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.06.2006, 15:12 |
|
||
|
Меняются поля класса, хотя и не должны
|
|||
|---|---|---|---|
|
#18+
На гуще не гадаем )) Покажите-ка код класса. ________________________________________________________ Глюк - это высокоорганизованная система не поддающихся определению частиц ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.06.2006, 22:18 |
|
||
|
Меняются поля класса, хотя и не должны
|
|||
|---|---|---|---|
|
#18+
Что-то я не увидел в классе оператора = ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.06.2006, 07:09 |
|
||
|
Меняются поля класса, хотя и не должны
|
|||
|---|---|---|---|
|
#18+
LelikkНа гуще не гадаем )) Покажите-ка код класса. Дык приложен в аттаче к моему первому посту.. muk07Что-то я не увидел в классе оператора = А нужен? И на что должен быть в таком случае похож? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.06.2006, 09:48 |
|
||
|
Меняются поля класса, хотя и не должны
|
|||
|---|---|---|---|
|
#18+
OpusИмеется простенький класс описывающий полином Хм. Может быть, я уже совсем забыл C++, но имхо проблема в том, что Вы вовсю возвращаете локальные объекты. Я не помню, как ведет себя компилятор в этом случае, но в принципе у него два выхода: либо таки вернуть указатель на мусор в стеке, либо вернуть копию локального объекта; подозреваю, он идет вторым путем. Тогда встает вопрос - как он делает копию. В отсутствие конструктора копирования (а либо я слеп, либо его не вижу) компилятор, сколь помнится, добавляет дефолтовый конструктор побайтового копирования. Этот конструктор, будучи вызванным, старательно откопирует Ваш указатель на массив коэффициентов; operator- воспользуется этим указателем и инвертирует коэффициенты, что приведет к неожиданному изменению во всех полиномах, ссылающихся на этот откопированный по указателю массив. Заодно можно ожидать проблем с памятью. P.S. Если сказал чушь - буду признателен за указание, где именно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.06.2006, 10:26 |
|
||
|
Меняются поля класса, хотя и не должны
|
|||
|---|---|---|---|
|
#18+
Вообще, мысль интересная, но вот в чем тогда вопрос: при создании объекта для него создается своей собственный массив koefs , в который затем копируется содержимое массива, переданного конструктору. Так что изменение содержимого массива у одного из объектов не должно сказываться на других, ведь массивы по сути разные. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.06.2006, 10:47 |
|
||
|
Меняются поля класса, хотя и не должны
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.06.2006, 11:09 |
|
||
|
Меняются поля класса, хотя и не должны
|
|||
|---|---|---|---|
|
#18+
В данном случае да, согласен. Более того, p1 и p2 будут вообще на один объект ссылаться (или нет?). Только у меня подобных вещей нет, присваивается результат выполнения операции над двумя объектами (во всяком случае, так задумано :)). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.06.2006, 11:33 |
|
||
|
Меняются поля класса, хотя и не должны
|
|||
|---|---|---|---|
|
#18+
OpusВ данном случае да, согласен. Более того, p1 и p2 будут вообще на один объект ссылаться (или нет?). Только у меня подобных вещей нет, присваивается результат выполнения операции над двумя объектами (во всяком случае, так задумано :)). Вам так кажется. Вы пытаетесь передавать Polynom по значению , что приводит к копированию... Оператор копирования не описан -> побайтное копирование -> ссылка на один и тот же массив koefs в двух или более объектах класса... ... Далее следует как минимум два вызова delete[] для каждого koefs... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.06.2006, 13:14 |
|
||
|
Меняются поля класса, хотя и не должны
|
|||
|---|---|---|---|
|
#18+
OpusБолее того, p1 и p2 будут вообще на один объект ссылаться (или нет?) Для того, чтобы куда-нибудь ссылаться, им пришлось бы быть указателями. Такое впечатление, что Вы не очень внимательно читали про "чем объекты в C++ отличаются от объектов Delphi или Java". Хм. В любом случае, с моей точки зрения сказано более чем достаточно для исправления ситуации. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.06.2006, 13:35 |
|
||
|
Меняются поля класса, хотя и не должны
|
|||
|---|---|---|---|
|
#18+
softwarerХм. В любом случае, с моей точки зрения сказано более чем достаточно для исправления ситуации. Примерно так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.06.2006, 13:46 |
|
||
|
Меняются поля класса, хотя и не должны
|
|||
|---|---|---|---|
|
#18+
andrey_anonymousПримерно так: :) По дельфовой привычке подумал - зачем копировать код, когда можно просто вызвать первый конструктор с параметрами p.power и p.koefs :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.06.2006, 13:50 |
|
||
|
Меняются поля класса, хотя и не должны
|
|||
|---|---|---|---|
|
#18+
softwarer andrey_anonymousПримерно так: :) По дельфовой привычке подумал - зачем копировать код, когда можно просто вызвать первый конструктор с параметрами p.power и p.koefs :) Вообще да. Но меня немного смущают авторские методы - классы передаются по значению, массивы нумеруются с единицы... И вообще код какой-то не си-плюс-плюсный :) Кстати, оператор присваивания тоже нужен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.06.2006, 15:26 |
|
||
|
Меняются поля класса, хотя и не должны
|
|||
|---|---|---|---|
|
#18+
Рассмотри вариант замены указателя на std::vector ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.06.2006, 18:14 |
|
||
|
Меняются поля класса, хотя и не должны
|
|||
|---|---|---|---|
|
#18+
andrey_anonymousНо меня немного смущают авторские методы - классы передаются по значению, массивы нумеруются с единицы... И вообще код какой-то не си-плюс-плюсный :) Массив у меня с 0 вообще-то. А что код не плюсный - просто всю жизнь на Java, а тут вдруг приспичило на плюсах накатать кой-чего.. Непривычно :) Насчет передачи классов по значению - во всех попадавшихся мне примерах было так. Значит, стоит переписать методы, чтобы они возвращали не Polynom , а Polynom& ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2006, 09:10 |
|
||
|
Меняются поля класса, хотя и не должны
|
|||
|---|---|---|---|
|
#18+
И принимать на вход желательно (const Polynom&) это исключит копирование объекта. Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2006, 09:24 |
|
||
|
Меняются поля класса, хотя и не должны
|
|||
|---|---|---|---|
|
#18+
PPAИ принимать на вход желательно (const Polynom&) это исключит копирование объекта. Должно получиться что-то вроде: Код: plaintext 1. 2. 3. 4. 5. 6. 7. Код: plaintext 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2006, 09:30 |
|
||
|
Меняются поля класса, хотя и не должны
|
|||
|---|---|---|---|
|
#18+
Хм. Может быть, я уже совсем забыл C++, но имхо проблема в том, что Вы вовсю возвращаете локальные объекты. Я не помню, как ведет себя компилятор в этом случае, но в принципе у него два выхода: Обычно он выдает предупреждения, если их не подавить. либо таки вернуть указатель на мусор в стеке, либо вернуть копию локального объекта; Первое. подозреваю, он идет вторым путем. Нет, первое. operator= и конструктор копирования также нужны, иначе разные объекты будут разделять одно и то же состояние (точнее его часть, массив double), а поддержки этого нет в коде. Хотя чтобы добавить поддержку также нужны конструктор копирования и оператор присваивания. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2006, 10:38 |
|
||
|
Меняются поля класса, хотя и не должны
|
|||
|---|---|---|---|
|
#18+
[quot Opus] Код: plaintext 1. 2. 3. 4. 5. 6. 7. [.quot] Такое надо возвращать по значению Код: plaintext 1. 2. 3. 4. 5. 6. 7. Нельзя выделять результат в хипе , его некому будет удалять. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2006, 10:42 |
|
||
|
Меняются поля класса, хотя и не должны
|
|||
|---|---|---|---|
|
#18+
Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2006, 10:46 |
|
||
|
Меняются поля класса, хотя и не должны
|
|||
|---|---|---|---|
|
#18+
Спасибо за подсказки, буду пробовать, как до дома дойду ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2006, 10:59 |
|
||
|
Меняются поля класса, хотя и не должны
|
|||
|---|---|---|---|
|
#18+
Код: 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. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2006, 11:01 |
|
||
|
Меняются поля класса, хотя и не должны
|
|||
|---|---|---|---|
|
#18+
MasterZiv Код: plaintext 1. 2. 3. 4. 5. 6. Там почти все методы-операции должны быть const, я забыл поставить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2006, 11:01 |
|
||
|
Меняются поля класса, хотя и не должны
|
|||
|---|---|---|---|
|
#18+
Спасибо :) Правда, уже сам до почти похожего докопался, вроде работает :) Кстати, пардон за баналность, а что такое const в сигнатуре метода? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2006, 21:22 |
|
||
|
Меняются поля класса, хотя и не должны
|
|||
|---|---|---|---|
|
#18+
OpusСпасибо :) Правда, уже сам до почти похожего докопался, вроде работает :) Кстати, пардон за баналность, а что такое const в сигнатуре метода? Это говорит о том, что метод не модифицирует состояние объекта (т.е. явно или косвенно не меняет своих мемберов) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2006, 23:15 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=33813289&tid=2030936]: |
0ms |
get settings: |
7ms |
get forum list: |
13ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
136ms |
get topic data: |
6ms |
get forum data: |
2ms |
get page messages: |
36ms |
get tp. blocked users: |
1ms |
| others: | 233ms |
| total: | 438ms |

| 0 / 0 |
