Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
79 / 79 / 20
Регистрация: 13.05.2009
Сообщений: 537
Записей в блоге: 1
1

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

01.04.2014, 13:10. Показов 1556. Ответов 15
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Есть некий класс, в нем есть метод 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;
.....}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.04.2014, 13:10
Ответы с готовыми решениями:

Ошибка при обращении из одного класса к методу другого класса
Структура проекта, 2 класса: класс графики MainWindow класс логики Сannibals при обращении из...

Не определяет класс при обращении к методу
почему не подгружается класс из другого, когда я обращаюсь к его методу??автоподгрузка модулей...

При обращении к методу значения переменных сбрасываются на 0
Почему при обращении к методу CalculateTotalPerDiem() значения всех переменных сбрасывается на...

Реализовать генерацию новых псевдослучайных чисел при обращении к методу
Проблема заключается вот в чем: Я обращаюсь к методу &quot;Inputrandom&quot; 2 раза, но он генерирует 2 раза...

15
18840 / 9839 / 2408
Регистрация: 30.01.2014
Сообщений: 17,280
01.04.2014, 14:16 2
MrAndrey_ka, метод Length должен быть таким:
C++
1
size_t Length() const;
1
79 / 79 / 20
Регистрация: 13.05.2009
Сообщений: 537
Записей в блоге: 1
01.04.2014, 14:44  [ТС] 3
большой сенкью, а объясни еще что значит это значит, и что значит после функции "const throw()"
0
18840 / 9839 / 2408
Регистрация: 30.01.2014
Сообщений: 17,280
01.04.2014, 15:01 4
Цитата Сообщение от MrAndrey_ka Посмотреть сообщение
а объясни еще что значит это значит
const после метода значит (и вообще это очень важно, никогда не стоит пренебрегать этим), что данный метод не меняет состояние объекта.

throw() означает, что данный метод не бросает никаких исключений. Впрочем на сегодняшний момент данная запись (так называемая спецификация исключений, помимо пустых скобок позволяла писать так же типы исключений, которые может бросать метод) считается устаревшей (не прижилась в практике). Вмесо нее в С++11 используется noexcept.
0
79 / 79 / 20
Регистрация: 13.05.2009
Сообщений: 537
Записей в блоге: 1
01.04.2014, 15:04  [ТС] 5
спасибо, понял...
и еще вопрос: оператор + должен описываться с двумя значениями или с одним
Mclass operator + (Mclass, Mclass); или Mclass operator + (Mclass)
0
18840 / 9839 / 2408
Регистрация: 30.01.2014
Сообщений: 17,280
01.04.2014, 15:19 6
Цитата Сообщение от MrAndrey_ka Посмотреть сообщение
должен описываться с двумя значениями или с одним
Если он метод класса, то с одним (второй - это this). А если свободная функия, то с двумя.
1
79 / 79 / 20
Регистрация: 13.05.2009
Сообщений: 537
Записей в блоге: 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 &)"
0
18840 / 9839 / 2408
Регистрация: 30.01.2014
Сообщений: 17,280
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.
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
02.04.2014, 12:43 9
Цитата Сообщение от DrOffset Посмотреть сообщение
Вот такой оператор невозможно описать как член класса
Вот было бы неплохо разрешать делать такие функции static как в шарпике.
Цитата Сообщение от DrOffset Посмотреть сообщение
что данный метод не меняет состояние объекта.
Хотелось бы добавить, что не меняет "видимое" состояние объекта, потому что могут быть mutable поля например.
1
18840 / 9839 / 2408
Регистрация: 30.01.2014
Сообщений: 17,280
02.04.2014, 13:48 10
Цитата Сообщение от Tulosba Посмотреть сообщение
Вот было бы неплохо разрешать делать такие функции static как в шарпике.
Боюсь это пошло бы в разрез с существующими правилами разрешения имен. А если их сохранять, то пришлось бы такой оператор извне вызывать так:
C++
1
c = SmartArray<int>::operator+(a, b);
За mutable плюс тебе. Хотя я про него нарочно не сказал. Я думаю, понятно почему. Средство, которым можно запросто изгадить архитектуру, если применять направо и налево.
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
02.04.2014, 14:07 11
Цитата Сообщение от DrOffset Посмотреть сообщение
Боюсь это пошло бы в разрез с существующими правилами разрешения имен.
Почему это? Можно ведь вызывать статический метод класса через экземпляр класса.
0
18840 / 9839 / 2408
Регистрация: 30.01.2014
Сообщений: 17,280
02.04.2014, 14:13 12
Цитата Сообщение от Tulosba Посмотреть сообщение
Почему это?
Я показал на примере. Там 'а', если ты помнишь по сообщению перед этим, - const char *.
Цитата Сообщение от Tulosba Посмотреть сообщение
Можно ведь вызывать статический метод класса через экземпляр класса.
Можно. Только в чем тогда будет его отличие от метода?

И самое главное, как в таком случае предлагаешь отличать метод-оператор, от неметода при компиляции?
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
02.04.2014, 14:25 13
Цитата Сообщение от DrOffset Посмотреть сообщение
как в таком случае предлагаешь отличать метод оператор, от не метода?
В том то и дело, что наличие свободных функций в языках типа шарпа недопустимо, а в сях из-за совместимости запрет не вводят. Всё-таки когда функция объявлена как статическая в классе, то это говорит о большей привязанности к классу (инкапсуляция, ООП и всё такое) нежели если бы она была свободной (и может быть дружественной).
А насчет разрешения имен можно было бы предложить использовать тот же оператор, что и сейчас используется для подобных целей ::.
C++
1
2
a + b // используем статический метод
a ::+ b // используем свободную функцию
Ну это, так сказать, в первом приближении.
0
18840 / 9839 / 2408
Регистрация: 30.01.2014
Сообщений: 17,280
02.04.2014, 14:32 14
Tulosba, С++ все еще недостаточно сложен, я полагаю?

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

Цитата Сообщение от Tulosba Посмотреть сообщение
а в сях из-за совместимости запрет не вводят.
И правильно. Зачем делать из С++ еще один С#?
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
02.04.2014, 14:47 15
Цитата Сообщение от DrOffset Посмотреть сообщение
Только нужно наоборот.
Для совместимости - да. Для эстетики - запретить свободные функции вовсе (правда тут всё начинает рушиться ещё с main() ). И, кстати, возможен ещё вариант "для совместимости": если через + не найдена статическая функция, то используем свободную. Или вообще не допускать одновременного существования свободных и статических с одинаковой сигнатурой. Короче, идей много
Цитата Сообщение от DrOffset Посмотреть сообщение
Зачем делать из С++ еще один С#?
С точки зрения синтаксиса C# в этом плане приятнее, а вот с точки зрения применения наверное стоило бы упомянуть D. Правда, сложно представить когда он сможет заменить плюсы, если сможет вообще.
0
18840 / 9839 / 2408
Регистрация: 30.01.2014
Сообщений: 17,280
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, то в любом случае придется придумывать альтернативный способ указания его в коде. И все эти способы добавляют больше проблем, чем решают. Пока что ни один из предложенных тобой вариантов не может быть реализован в современном С++ без значительных потерь. ИМХО, стоит задуматься, отчего функции подобного рода запрещены стандартом.
0
02.04.2014, 19:06
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.04.2014, 19:06
Помогаю со студенческими работами здесь

Для нестатического поля, метода или свойства требуется ссылка на объект В каждом case при обращении к методу
В каждом case при обращении к методу выдает такую ошибку, если не сложно покажите как исправить...

Изменение константного объекта с применением const_cast
1. Это код из учебника С. Прата &quot;Лекции и упражнения&quot;. #include &lt;iostream&gt; using namespace...

Ссылка на объект не указывает на экземпляр объекта при обращении к LinkButton
На странице имеется LinkButton1(уже создан). Генерирую текст в переменную htmlStr. Пробую записать...

В экземпляре объекта не задана ссылка на объект при обращении к ListBox
есть БД MySql, listBox, TextBox и кнопка я выделяю строку в listBox заношу данные в TextBox...

Инициализация константного статического объекта - члена класса
Здравствуйте, у меня возникла проблема с инициализацией статического объекта, который является...

Ссылка на объект не указывает на экземпляр объекта при обращении к свойству tag
Доброе время суток. Объясните пожалуйста откуда сие берется..


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru