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

Ошибка при обращении к методу константного объекта - C++

Восстановить пароль Регистрация
 
MrAndrey_ka
 Аватар для MrAndrey_ka
77 / 77 / 2
Регистрация: 13.05.2009
Сообщений: 536
Записей в блоге: 1
01.04.2014, 13:10     Ошибка при обращении к методу константного объекта #1
Есть некий класс, в нем есть метод const size_t Length();
пишу оператор сложения
C++
1
2
3
 Class& operator + (const Class& Val) {
    if (Val.Length() == 0) return *this;
.....}
получаю ошибку: error C2662: const size_t Class::Length(void): невозможно преобразовать указатель "this" из "const Class" в "Class &"

что я делаю не так? напрашивается конечно вариант: Class& operator + (Class& Val). но к нему прибегать не хотелось бы!

Добавлено через 11 минут
хотел упростить код, но вышло что в упрощенной версии все работает, так что вот версия которая не работает
C++
1
2
3
4
5
 
template <class Type>
Class <Type>& operator + (const Class<Type>& Val) {
    if (Val.Length() == 0) return *this;
.....}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.04.2014, 13:10     Ошибка при обращении к методу константного объекта
Посмотрите здесь:

Почему не происходит ошибка при обращении к недопустимому индексу C++
C++ Ошибка при обращении к элементу строки *s
Массивы структур (при обращении к элементу массива выскакивает ошибка) C++
C++ Передача объекта методу другого объекта другого класса
C++ Инициализация константного статического объекта - члена класса
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DrOffset
6462 / 3836 / 887
Регистрация: 30.01.2014
Сообщений: 6,631
01.04.2014, 14:16     Ошибка при обращении к методу константного объекта #2
MrAndrey_ka, метод Length должен быть таким:
C++
1
size_t Length() const;
MrAndrey_ka
 Аватар для MrAndrey_ka
77 / 77 / 2
Регистрация: 13.05.2009
Сообщений: 536
Записей в блоге: 1
01.04.2014, 14:44  [ТС]     Ошибка при обращении к методу константного объекта #3
большой сенкью, а объясни еще что значит это значит, и что значит после функции "const throw()"
DrOffset
6462 / 3836 / 887
Регистрация: 30.01.2014
Сообщений: 6,631
01.04.2014, 15:01     Ошибка при обращении к методу константного объекта #4
Цитата Сообщение от MrAndrey_ka Посмотреть сообщение
а объясни еще что значит это значит
const после метода значит (и вообще это очень важно, никогда не стоит пренебрегать этим), что данный метод не меняет состояние объекта.

throw() означает, что данный метод не бросает никаких исключений. Впрочем на сегодняшний момент данная запись (так называемая спецификация исключений, помимо пустых скобок позволяла писать так же типы исключений, которые может бросать метод) считается устаревшей (не прижилась в практике). Вмесо нее в С++11 используется noexcept.
MrAndrey_ka
 Аватар для MrAndrey_ka
77 / 77 / 2
Регистрация: 13.05.2009
Сообщений: 536
Записей в блоге: 1
01.04.2014, 15:04  [ТС]     Ошибка при обращении к методу константного объекта #5
спасибо, понял...
и еще вопрос: оператор + должен описываться с двумя значениями или с одним
Mclass operator + (Mclass, Mclass); или Mclass operator + (Mclass)
DrOffset
6462 / 3836 / 887
Регистрация: 30.01.2014
Сообщений: 6,631
01.04.2014, 15:19     Ошибка при обращении к методу константного объекта #6
Цитата Сообщение от MrAndrey_ka Посмотреть сообщение
должен описываться с двумя значениями или с одним
Если он метод класса, то с одним (второй - это this). А если свободная функия, то с двумя.
MrAndrey_ka
 Аватар для MrAndrey_ka
77 / 77 / 2
Регистрация: 13.05.2009
Сообщений: 536
Записей в блоге: 1
01.04.2014, 15:30  [ТС]     Ошибка при обращении к методу константного объекта #7
1) а какая разница как описывать и как лучше?
2) написал
C++
1
inline friend SmartArray<Type> operator + (const SmartArray<Type>& Val1, const SmartArray<Type>& Val2){....};
так работает, но тело функции не маленькое, а как это чудо описать вне класса? пишу
C++
1
2
template <class Type>
SmartArray<Type> operator + (const SmartArray<Type>& Val1, const SmartArray<Type>& Val2){
выдает ссылка на неразрешенный внешний символ "class SmartArray<char> __cdecl operator+(class SmartArray<char> const &,class SmartArray<char> const &)"
DrOffset
6462 / 3836 / 887
Регистрация: 30.01.2014
Сообщений: 6,631
01.04.2014, 22:28     Ошибка при обращении к методу константного объекта #8
Цитата Сообщение от MrAndrey_ka Посмотреть сообщение
1) а какая разница как описывать и как лучше?
Зависит от задачи, и от смысла Нельзя говорит что одно лучше, а другое хуже. Это по ситуации определяют.
Цитата Сообщение от MrAndrey_ka Посмотреть сообщение
2) написал
Вот тебе образец (семантику класса не сохранял, лень - это чисто демонстрация).
C++
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
template<class T>
class SmartArray;
 
template<class T>
SmartArray<T> operator+(SmartArray<T> const & a, SmartArray<T> const & b);
 
template<class T>
class SmartArray
{
public:
    SmartArray(T const & a) : value_(a) {}
 
    friend SmartArray operator+<T>(SmartArray const & a, SmartArray const & b);
 
private:
    T value_;
};
 
template <class T>
SmartArray<T> operator+(SmartArray<T> const & a, SmartArray<T> const & b)
{
    return SmartArray<T>(a.value_ + b.value_);
}
 
int main()
{
    SmartArray<int> a(5);
    SmartArray<int> b(5);
 
    SmartArray<int> c = a + b;
 
    return 0;
}
А вообще в твоем случае, лучше все-таки метод использовать, а не friend-функцию. У тебя же аргументы одинакового типа. А friend-функцию обычно используют, если первый аргумент оператора, например, может быть другим типом. К примеру встроенным:
C++
1
std::string operator+(char const *, std::string const &);
Вот такой оператор невозможно описать как член класса и его можно сделать френдом классу std::string.
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
02.04.2014, 12:43     Ошибка при обращении к методу константного объекта #9
Цитата Сообщение от DrOffset Посмотреть сообщение
Вот такой оператор невозможно описать как член класса
Вот было бы неплохо разрешать делать такие функции static как в шарпике.
Цитата Сообщение от DrOffset Посмотреть сообщение
что данный метод не меняет состояние объекта.
Хотелось бы добавить, что не меняет "видимое" состояние объекта, потому что могут быть mutable поля например.
DrOffset
6462 / 3836 / 887
Регистрация: 30.01.2014
Сообщений: 6,631
02.04.2014, 13:48     Ошибка при обращении к методу константного объекта #10
Цитата Сообщение от Tulosba Посмотреть сообщение
Вот было бы неплохо разрешать делать такие функции static как в шарпике.
Боюсь это пошло бы в разрез с существующими правилами разрешения имен. А если их сохранять, то пришлось бы такой оператор извне вызывать так:
C++
1
c = SmartArray<int>::operator+(a, b);
За mutable плюс тебе. Хотя я про него нарочно не сказал. Я думаю, понятно почему. Средство, которым можно запросто изгадить архитектуру, если применять направо и налево.
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
02.04.2014, 14:07     Ошибка при обращении к методу константного объекта #11
Цитата Сообщение от DrOffset Посмотреть сообщение
Боюсь это пошло бы в разрез с существующими правилами разрешения имен.
Почему это? Можно ведь вызывать статический метод класса через экземпляр класса.
DrOffset
6462 / 3836 / 887
Регистрация: 30.01.2014
Сообщений: 6,631
02.04.2014, 14:13     Ошибка при обращении к методу константного объекта #12
Цитата Сообщение от Tulosba Посмотреть сообщение
Почему это?
Я показал на примере. Там 'а', если ты помнишь по сообщению перед этим, - const char *.
Цитата Сообщение от Tulosba Посмотреть сообщение
Можно ведь вызывать статический метод класса через экземпляр класса.
Можно. Только в чем тогда будет его отличие от метода?

И самое главное, как в таком случае предлагаешь отличать метод-оператор, от неметода при компиляции?
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
02.04.2014, 14:25     Ошибка при обращении к методу константного объекта #13
Цитата Сообщение от DrOffset Посмотреть сообщение
как в таком случае предлагаешь отличать метод оператор, от не метода?
В том то и дело, что наличие свободных функций в языках типа шарпа недопустимо, а в сях из-за совместимости запрет не вводят. Всё-таки когда функция объявлена как статическая в классе, то это говорит о большей привязанности к классу (инкапсуляция, ООП и всё такое) нежели если бы она была свободной (и может быть дружественной).
А насчет разрешения имен можно было бы предложить использовать тот же оператор, что и сейчас используется для подобных целей ::.
C++
1
2
a + b // используем статический метод
a ::+ b // используем свободную функцию
Ну это, так сказать, в первом приближении.
DrOffset
6462 / 3836 / 887
Регистрация: 30.01.2014
Сообщений: 6,631
02.04.2014, 14:32     Ошибка при обращении к методу константного объекта #14
Tulosba, С++ все еще недостаточно сложен, я полагаю?

Цитата Сообщение от Tulosba Посмотреть сообщение
C++
1
2
a + b // используем статический метод 
a ::+ b // используем свободную функцию
Только нужно наоборот. Потому что иначе весь существующий код сломается и начнет искать + среди статических функций класса. А если функция определена в каком-то нейспейсе, то декорация через :: оператора превратится в ужас... И без слова operator все равно не обойтись.

Цитата Сообщение от Tulosba Посмотреть сообщение
а в сях из-за совместимости запрет не вводят.
И правильно. Зачем делать из С++ еще один С#?
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
02.04.2014, 14:47     Ошибка при обращении к методу константного объекта #15
Цитата Сообщение от DrOffset Посмотреть сообщение
Только нужно наоборот.
Для совместимости - да. Для эстетики - запретить свободные функции вовсе (правда тут всё начинает рушиться ещё с main() ). И, кстати, возможен ещё вариант "для совместимости": если через + не найдена статическая функция, то используем свободную. Или вообще не допускать одновременного существования свободных и статических с одинаковой сигнатурой. Короче, идей много
Цитата Сообщение от DrOffset Посмотреть сообщение
Зачем делать из С++ еще один С#?
С точки зрения синтаксиса C# в этом плане приятнее, а вот с точки зрения применения наверное стоило бы упомянуть D. Правда, сложно представить когда он сможет заменить плюсы, если сможет вообще.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.04.2014, 19:06     Ошибка при обращении к методу константного объекта
Еще ссылки по теме:

C++ Беру и спокойно вызываю неконстантную функцию для константного объекта
C++ Ошибка при обращении к статическому члену
Как обращаться к методу динамически созданного объекта? C++

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

Или воспользуйтесь поиском по форуму:
DrOffset
6462 / 3836 / 887
Регистрация: 30.01.2014
Сообщений: 6,631
02.04.2014, 19:06     Ошибка при обращении к методу константного объекта #16
Tulosba, если хочется использовать С#, то надо использовать С#. Пока что подобные вышеизложенной фиче не очень вписываются в идеологию С++.
Без нарушения совместимости с остальным кодом твою идею в С++ не продвинуть. Поэтому на это никто не пойдет.
Цитата Сообщение от Tulosba Посмотреть сообщение
не найдена статическая функция, то используем свободную
Как это поможет отличить функцию static от метода? Если предполагается такой синтаксис:
C++
1
a = b + c;
Способ это обеспечить уже есть - использовать метод. Да, первый параметр в этом случае зарезервирован. Если разрешить static метод для двух аргументов, в которых первый параметр отличного типа, вызывать с тем же синтаксисом, то без пересмотра способа разрешения имен это будет невозможно сделать. Или нужно будет писать что-то вроде этого (что совершенно избыточно):
C++
1
A::operator+("test", a);
Либо так (еще и некрасиво)
C++
1
a.operator+("test", a);
Если разрешать делать static operator, то в любом случае придется придумывать альтернативный способ указания его в коде. И все эти способы добавляют больше проблем, чем решают. Пока что ни один из предложенных тобой вариантов не может быть реализован в современном С++ без значительных потерь. ИМХО, стоит задуматься, отчего функции подобного рода запрещены стандартом.
Yandex
Объявления
02.04.2014, 19:06     Ошибка при обращении к методу константного объекта
Ответ Создать тему
Опции темы

Текущее время: 17:41. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru