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

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

Восстановить пароль Регистрация
 
Agent Smith
40 / 40 / 9
Регистрация: 24.11.2012
Сообщений: 200
10.03.2013, 10:42     вызвать неперегруженный оператор при наличии перегруженного #1
привет всем. возникла такая проблема: есть два объекта одного класса и перегруженный оператор=. одним из полей этих объектов является указатель на указатель(квадратная матрица порядка n). в теле перегруженного орератора проверяется, одинаковы ли размеры этих матриц. если нет, то нужно перевыделить память и выполнить присвоение. так вот, возможно ли внутри этого перегруженного оператора после перевыделения памяти вызвать стандартный, неперегруженный оператор присвоения для этих объектов?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
SummerRain
 Аватар для SummerRain
325 / 324 / 17
Регистрация: 16.12.2012
Сообщений: 544
10.03.2013, 12:40     вызвать неперегруженный оператор при наличии перегруженного #2
Да, в теле реализации перегружаемых операторов почти используются их стандартные близнецы.
Agent Smith
40 / 40 / 9
Регистрация: 24.11.2012
Сообщений: 200
10.03.2013, 13:16  [ТС]     вызвать неперегруженный оператор при наличии перегруженного #3
так как указать, что нужно вызывать именно неперегруженный оператор? у них совпадают сигнатуры, и снова вызывается перегруженный. в итоге—Stack Overflow
SummerRain
 Аватар для SummerRain
325 / 324 / 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;
    }
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;
 }
я так понимаю это невозможно, т.к транслятор не может сам определить, что нужно использовать стандартный оператор=, и все время использует перегруженный. в итоге эта цепочка вызовов приводит к переполнению стека. я думал может какое-нибудь :: поможет или еще что
ITcrusader
Эксперт C++
 Аватар для ITcrusader
176 / 162 / 8
Регистрация: 12.02.2013
Сообщений: 410
10.03.2013, 16:51     вызвать неперегруженный оператор при наличии перегруженного #6
Agent Smith, нененене. У тебя дескриптор динамической памяти инкапсулирован в объекте. Для такого класса оператор присваивания по умолчанию - побитовый копировальщик. Который похерит вссе, над чем ты старательно трудился. Поэтому в таком контексте о копировании по умолчанию и речи быть не может. Далее, если ты в целях оптимизации не хочешь перевыделять память в случае, скажем, совпадения размерностей, то заведи закрытую функу, как часть внутренней реализации класса, которая пробегается по матрицам, копируя значения.
SummerRain
 Аватар для SummerRain
325 / 324 / 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 конструкторы. В этом случае не будет никаких проблем
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
14.03.2013, 14:57     вызвать неперегруженный оператор при наличии перегруженного #8
Цитата Сообщение от Agent Smith Посмотреть сообщение

Не по теме:

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

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

Не по теме:

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

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.03.2013, 17:30     вызвать неперегруженный оператор при наличии перегруженного
Еще ссылки по теме:

Как вызвать оператор базового класса в наследнике? C++
глюк при написании перегруженного ostream для класса C++
C++ Как можно явно вызвать оператор преобразования?

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

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

Не по теме:

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

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

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