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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
MrAndrey_ka
78 / 78 / 2
Регистрация: 13.05.2009
Сообщений: 537
Записей в блоге: 1
#1

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

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

Есть некий класс, в нем есть метод 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.04.2014, 13:10
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Ошибка при обращении к методу константного объекта (C++):

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

Изменение константного объекта с применением const_cast - C++
1. Это код из учебника С. Прата &quot;Лекции и упражнения&quot;. #include &lt;iostream&gt; using namespace std; void change(const int* pt,...

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

Беру и спокойно вызываю неконстантную функцию для константного объекта - C++
Это как ? Везде пишут, что сие невозможно в принципе. Или есть исключение для конструктора ? #include &lt;iostream&gt; using namespace...

Ошибка при обращении к классу - C++
Есть класс для хранения элементов, к которым должен быть доступ из других классов - решил объявить как глобальный: Items.h: class...

Ошибка при обращении к указателю: maybe you mean to use '->' - C++
#include &lt;windows.h&gt; #include &lt;stdio.h&gt; #include &lt;conio.h&gt; struct book { char avtor; //fio char caption; ...

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

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

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

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

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

Ошибка при обращении к элементу строки *s - C++
Помогите, пожалуйста. Задача: описать рекурсивную функцию digits(s) целого типа, находящую кол-во цифр в строке s без использования...

Ошибка при обращении к статическому члену - C++
... static void InfinityLoop(); ... //В теле main MyClass::InfinityLoop();} class MyClass{ public: static void...

Ошибка сегментации при обращении к данным контейнера - C++
Вот такой вопрос почему ошибка сигментации возникла не пойму. Задание: Биолог изучает размножение бактерий. Каждый час количество...

Почему не происходит ошибка при обращении к недопустимому индексу - C++
#include &lt;string&gt; int main() { std::string s; s; } Исключения не происходит. Внимание вопрос: я схожу с ума, я не знаю цпп...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru