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

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

Войти
Регистрация
Восстановить пароль
 
Agent Smith
40 / 40 / 9
Регистрация: 24.11.2012
Сообщений: 200
#1

вызвать неперегруженный оператор при наличии перегруженного - C++

10.03.2013, 10:42. Просмотров 443. Ответов 10
Метки нет (Все метки)

привет всем. возникла такая проблема: есть два объекта одного класса и перегруженный оператор=. одним из полей этих объектов является указатель на указатель(квадратная матрица порядка n). в теле перегруженного орератора проверяется, одинаковы ли размеры этих матриц. если нет, то нужно перевыделить память и выполнить присвоение. так вот, возможно ли внутри этого перегруженного оператора после перевыделения памяти вызвать стандартный, неперегруженный оператор присвоения для этих объектов?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.03.2013, 10:42
Здравствуйте! Я подобрал для вас темы с ответами на вопрос вызвать неперегруженный оператор при наличии перегруженного (C++):

Ошибка при вызове в switch перегруженного оператора - C++
есть перегруженный оператор: std::istream& operator>>(istream& is, diagram& dd) { string kod; std::cout<<"Vvedite kod:"<<endl; ...

глюк при написании перегруженного ostream для класса - C++
Доброе время суток всем! Возникла проблема есть некий класс client смотреть ниже класс авто и класс персона Все отлично работало до того...

Синтаксическая ошибка при определении метода перегруженного оператора,за классом - C++
Есть два класса. Point1 и Pointer1 Синтаксическая Ошибка в Pointer1.cpp в перегрузке операторов. Point1.h #pragma once ...

Ошибка при использовании перегруженного оператора вывода в поток: no match for 'operator<<' - C++
Пытаюсь написать класс комплексных чисел, но не могу сделать вот что: #include &lt;iostream&gt; #include &quot;head.h&quot; using namespace std; ...

Как можно явно вызвать оператор преобразования? - C++
Доброго времени суток Как можно явно вызвать такой оператор преобразования? struct CL { template &lt;class A, class B, class...

Как вызвать оператор базового класса в наследнике? - C++
Всем привет! Имеется такая конструкция (мой вопрос - в комментарии к последнему классу): class A { A(); ~A(); virtual...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
SummerRain
326 / 325 / 17
Регистрация: 16.12.2012
Сообщений: 544
10.03.2013, 12:40 #2
Да, в теле реализации перегружаемых операторов почти используются их стандартные близнецы.
0
Agent Smith
40 / 40 / 9
Регистрация: 24.11.2012
Сообщений: 200
10.03.2013, 13:16  [ТС] #3
так как указать, что нужно вызывать именно неперегруженный оператор? у них совпадают сигнатуры, и снова вызывается перегруженный. в итоге—Stack Overflow
0
SummerRain
326 / 325 / 17
Регистрация: 16.12.2012
Сообщений: 544
10.03.2013, 13:45 #4
это уже дело компилятора. При присваивании стандартных типов будет использоваться стандартный оператор, а при присваивании пользовательских типов компилятор начнёт искать перегруженные версии. Вот пример
C++
1
2
3
4
5
6
7
8
Integer& operator=(const Integer& right) {
        //проверка на самоприсваивание
        if (this == &right) {
            return *this;
        }
        value = right.value;  // стандартная версия
        return *this;
    }
0
Agent Smith
40 / 40 / 9
Регистрация: 24.11.2012
Сообщений: 200
10.03.2013, 15:58  [ТС] #5
SummerRain, так вот в том то и проблема, что я внутри перегруженного оператора хочу использовать стандартный, примененный к этим же объектам. то есть их сигнатуры совпадают. так например
C++
1
2
3
4
5
6
7
Integer& operator=(const Integer& right)
 {
     if(right.value!=0)
      return *this=right;//вот здесь хочу использовать стандартный оператор=
     else
      return *this;
 }
я так понимаю это невозможно, т.к транслятор не может сам определить, что нужно использовать стандартный оператор=, и все время использует перегруженный. в итоге эта цепочка вызовов приводит к переполнению стека. я думал может какое-нибудь :: поможет или еще что
0
ITcrusader
Эксперт C++
176 / 162 / 8
Регистрация: 12.02.2013
Сообщений: 410
10.03.2013, 16:51 #6
Agent Smith, нененене. У тебя дескриптор динамической памяти инкапсулирован в объекте. Для такого класса оператор присваивания по умолчанию - побитовый копировальщик. Который похерит вссе, над чем ты старательно трудился. Поэтому в таком контексте о копировании по умолчанию и речи быть не может. Далее, если ты в целях оптимизации не хочешь перевыделять память в случае, скажем, совпадения размерностей, то заведи закрытую функу, как часть внутренней реализации класса, которая пробегается по матрицам, копируя значения.
1
SummerRain
326 / 325 / 17
Регистрация: 16.12.2012
Сообщений: 544
10.03.2013, 18:26 #7
Цитата Сообщение от Agent Smith Посмотреть сообщение
SummerRain, так вот в том то и проблема, что я внутри перегруженного оператора хочу использовать стандартный, примененный к этим же объектам. то есть их сигнатуры совпадают. так например
C++
1
2
3
4
5
6
7
Integer& operator=(const Integer& right)
 {
     if(right.value!=0)
      return *this=right;//вот здесь хочу использовать стандартный оператор=
     else
      return *this;
 }
я так понимаю это невозможно, т.к транслятор не может сам определить, что нужно использовать стандартный оператор=, и все время использует перегруженный. в итоге эта цепочка вызовов приводит к переполнению стека. я думал может какое-нибудь :: поможет или еще что
он и будет здесь стандартным, если в твоём классе один член и ты не использовал explicit конструкторы. В этом случае не будет никаких проблем
0
silent_1991
Эксперт С++
4964 / 3040 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
14.03.2013, 14:57 #8
Цитата Сообщение от Agent Smith Посмотреть сообщение

Не по теме:

*this=right;//вот здесь хочу использовать стандартный оператор=

Это желание сродни желанию вызвать стандартный конструктор по умолчанию при наличии реализованного вами. Как только вы определили оператор присваивания - вы заменили им тот, что предоставляет компилятор. "Стандартный" уже никак не вызвать, потому что теперь "стандартный" (в контексте данного класса) - это реализованный вами. Просто скопируйте все поля класса в этом месте явным образом.
1
aLarman
642 / 563 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
14.03.2013, 15:49 #9
а смысл вызывать стандартный, если он тебе сделает неправильные действия?, даже когда ты сровняешь размерности матриц, и каким либо "магическим образом вызовешь стандартный, то он тебе сделает перекопирование указателей а не их содержимого, поэтому у тебя 1 вариант, перераспределить память (в случае необходимости) а потом пробежаться по матрице и перекопировать объекты
0
silent_1991
14.03.2013, 16:14
  #10

Не по теме:

Цитата Сообщение от aLarman Посмотреть сообщение
неправильные действия
Цитата Сообщение от aLarman Посмотреть сообщение
перекопирование указателей а не их содержимого
Такое поведение не всегда неправильное. В программировании, как и во всём остальном, нет ничего абсолютного. Почитайте про идиому copy-on-write.

0
aLarman
14.03.2013, 17:30     вызвать неперегруженный оператор при наличии перегруженного
  #11

Не по теме:

Цитата Сообщение от Agent Smith Посмотреть сообщение
одним из полей этих объектов является указатель на указатель(квадратная матрица порядка n)
помоему подразумевает копирование содержимого, ответ был дан на текущий контекст

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.03.2013, 17:30
Привет! Вот еще темы с ответами:

Как вызвать в главной программе оператор унарный минус - C++
Paint operator-(const Paint&amp; p) { return Paint(-p.x,-p.y); }

Программа вылетает при наличии syslink - C++
Доброго времени суток, друзья. К сожалению, на данный момент я довольно посредственный программист, но хотелось бы спросить не...

Выполнения программы на 2-ух ядрах при наличии 4-х - C++
Привет кодеры! Короче у меня комп включает в себя 4-х ядерный процессор. Задача такая что, я хочу, чтобы моя программа использовала...

Вывод содержимого vector при наличии бесконечного цикла - C++
День добрый! Возникла проблема с выводом содержимого vector-а. Вот код: #include &lt;iostream&gt; #include &lt;vector&gt; std :: vector...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
14.03.2013, 17:30
Ответ Создать тему
Опции темы

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