1 | |||||||||||
Ошибка при обращении к методу константного объекта01.04.2014, 13:10. Показов 1556. Ответов 15
Метки нет (Все метки)
Есть некий класс, в нем есть метод const size_t Length();
пишу оператор сложения
что я делаю не так? напрашивается конечно вариант: Class& operator + (Class& Val). но к нему прибегать не хотелось бы! Добавлено через 11 минут хотел упростить код, но вышло что в упрощенной версии все работает, так что вот версия которая не работает
0
|
01.04.2014, 13:10 | |
Ответы с готовыми решениями:
15
Ошибка при обращении из одного класса к методу другого класса Не определяет класс при обращении к методу При обращении к методу значения переменных сбрасываются на 0 Реализовать генерацию новых псевдослучайных чисел при обращении к методу |
18840 / 9839 / 2408
Регистрация: 30.01.2014
Сообщений: 17,280
|
||||||
01.04.2014, 14:16 | 2 | |||||
MrAndrey_ka, метод Length должен быть таким:
1
|
18840 / 9839 / 2408
Регистрация: 30.01.2014
Сообщений: 17,280
|
|
01.04.2014, 15:01 | 4 |
const после метода значит (и вообще это очень важно, никогда не стоит пренебрегать этим), что данный метод не меняет состояние объекта.
throw() означает, что данный метод не бросает никаких исключений. Впрочем на сегодняшний момент данная запись (так называемая спецификация исключений, помимо пустых скобок позволяла писать так же типы исключений, которые может бросать метод) считается устаревшей (не прижилась в практике). Вмесо нее в С++11 используется noexcept.
0
|
18840 / 9839 / 2408
Регистрация: 30.01.2014
Сообщений: 17,280
|
|
01.04.2014, 15:19 | 6 |
Если он метод класса, то с одним (второй - это this). А если свободная функия, то с двумя.
1
|
01.04.2014, 15:30 [ТС] | 7 | ||||||||||
1) а какая разница как описывать и как лучше?
2) написал
0
|
18840 / 9839 / 2408
Регистрация: 30.01.2014
Сообщений: 17,280
|
|||||||||||
01.04.2014, 22:28 | 8 | ||||||||||
Зависит от задачи, и от смысла Нельзя говорит что одно лучше, а другое хуже. Это по ситуации определяют.
Вот тебе образец (семантику класса не сохранял, лень - это чисто демонстрация).
0
|
:)
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
|
|
02.04.2014, 12:43 | 9 |
Вот было бы неплохо разрешать делать такие функции static как в шарпике.
Хотелось бы добавить, что не меняет "видимое" состояние объекта, потому что могут быть mutable поля например.
1
|
18840 / 9839 / 2408
Регистрация: 30.01.2014
Сообщений: 17,280
|
||||||
02.04.2014, 13:48 | 10 | |||||
Боюсь это пошло бы в разрез с существующими правилами разрешения имен. А если их сохранять, то пришлось бы такой оператор извне вызывать так:
0
|
18840 / 9839 / 2408
Регистрация: 30.01.2014
Сообщений: 17,280
|
|
02.04.2014, 14:13 | 12 |
Я показал на примере. Там 'а', если ты помнишь по сообщению перед этим, - const char *.
Можно. Только в чем тогда будет его отличие от метода? И самое главное, как в таком случае предлагаешь отличать метод-оператор, от неметода при компиляции?
0
|
:)
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
|
||||||
02.04.2014, 14:25 | 13 | |||||
В том то и дело, что наличие свободных функций в языках типа шарпа недопустимо, а в сях из-за совместимости запрет не вводят. Всё-таки когда функция объявлена как статическая в классе, то это говорит о большей привязанности к классу (инкапсуляция, ООП и всё такое) нежели если бы она была свободной (и может быть дружественной).
А насчет разрешения имен можно было бы предложить использовать тот же оператор, что и сейчас используется для подобных целей ::.
0
|
18840 / 9839 / 2408
Регистрация: 30.01.2014
Сообщений: 17,280
|
|
02.04.2014, 14:32 | 14 |
Tulosba, С++ все еще недостаточно сложен, я полагаю?
Только нужно наоборот. Потому что иначе весь существующий код сломается и начнет искать + среди статических функций класса. А если функция определена в каком-то нейспейсе, то декорация через :: оператора превратится в ужас... И без слова operator все равно не обойтись. И правильно. Зачем делать из С++ еще один С#?
0
|
:)
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
|
|
02.04.2014, 14:47 | 15 |
Для совместимости - да. Для эстетики - запретить свободные функции вовсе (правда тут всё начинает рушиться ещё с main() ). И, кстати, возможен ещё вариант "для совместимости": если через + не найдена статическая функция, то используем свободную. Или вообще не допускать одновременного существования свободных и статических с одинаковой сигнатурой. Короче, идей много
С точки зрения синтаксиса C# в этом плане приятнее, а вот с точки зрения применения наверное стоило бы упомянуть D. Правда, сложно представить когда он сможет заменить плюсы, если сможет вообще.
0
|
18840 / 9839 / 2408
Регистрация: 30.01.2014
Сообщений: 17,280
|
||||||||||||||||
02.04.2014, 19:06 | 16 | |||||||||||||||
Tulosba, если хочется использовать С#, то надо использовать С#. Пока что подобные вышеизложенной фиче не очень вписываются в идеологию С++.
Без нарушения совместимости с остальным кодом твою идею в С++ не продвинуть. Поэтому на это никто не пойдет. Как это поможет отличить функцию static от метода? Если предполагается такой синтаксис:
0
|
02.04.2014, 19:06 | |
02.04.2014, 19:06 | |
Помогаю со студенческими работами здесь
16
Для нестатического поля, метода или свойства требуется ссылка на объект В каждом case при обращении к методу Изменение константного объекта с применением const_cast Ссылка на объект не указывает на экземпляр объекта при обращении к LinkButton В экземпляре объекта не задана ссылка на объект при обращении к ListBox Инициализация константного статического объекта - члена класса Ссылка на объект не указывает на экземпляр объекта при обращении к свойству tag Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |