Падение при вызове оператора.

Тема в разделе "LANGS.C", создана пользователем Mika0x65, 14 июн 2007.

  1. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Мое почтение всем.

    В колледже задали простенькую задачу -- перегрузить пару операторов в С++. Вроде, все сделал, но при использовании перегруженного оператора "+" происхожит обвал. Судя по дизасму, у временного объекта по каким-то причинам не вызывается конструктор. В результате, происходит попытка записи в неинициализированный член класса.

    P.s. Ассемблерные вставки не являются требованием -- сделал их просто от скуки, да и чтобы препод не расслаблялся :). Попытка заменить их на С++ код ни к чему не привела. Код компилировался под MS VS 2005.

    Код можно посмотреть тут (аттачи не работают?) Заранее благодарен.
     
  2. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Mika0x65

    Потому что size и data надо инициализировать во всех конструкторах, а не только в конструкторе по умолчанию. И юзай списки инициализации. Код - ужоснах.
     
  3. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    Mika0x65
    1) Какой конструктор должен быть вызван в ответ на ARRAY result(*max_ptr);?
    2) Imho один аргумент твоего варианта operator+ не логичен. Я бы предпочел ARRAY ARRAY::operator+(const ARRAY& arg1, const ARRAY& arg2). Один аргумент логичен для operator+=.
     
  4. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    q_q

    Все там логично. operator + может быть как мембером, так и free-function.
     
  5. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    _DEN_
    Они и инициализируются во всех конструкторах.

    Код (Text):
    1. ARRAY::ARRAY()
    2. {
    3.     size = 0;
    4.     data = NULL;
    5. }
    6.  
    7. ARRAY::ARRAY(unsigned int size)
    8. {
    9.     this ->size = size;
    10.     data = NULL;
    11.  
    12.     if (size)
    13.         data = new int [size];
    14. }
    + то, что на ассемблере.

    В чем заключается "ужоснаховость" кода? Это, конечно, не произведение искусства, но ничего жутокого я не вижу.

    q_q
    1). Как я понимаю -- второй сверху из тех, что я привел выше.
    2). Вы уверены, что так? MS VS говорит мне:
     
  6. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Mika0x65

    Конструктор копирования посмотри.

    Не понял? Одного моего ультраавторитетного мнения уже не достаточно? :))))))
     
  7. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    а разве ARRAY result(*max_ptr); вызывает конструктор ARRAY::ARRAY(const ARRAY &array) ?
    ты же не по ссылке передаешь.
     
  8. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Mika0x65

    operator + может быть членом класса, а может и не быть. В первом случае он имеет один параметр, во втором - два. В первом случае вторым параметром выступает *this.

    edit: орфография
     
  9. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    n0name

    Разыменованый указатель это ссылка.
     
  10. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    блин ;)
     
  11. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    _DEN_
    Все там логично ... operator + может быть членом класса, а может и не быть
    Моя логика: оператор+ подразумевает три участника - слагаемые (два) и результат, оператор+= подразумевает два участника, один из которых является и результатом. Т.е. моя логика не в том где и сколько параметров, а в том, что оператор+ логичнее как friend function, а оператор+= - как member.


    Mika0x65
    Вы уверены, что так?
    Разумеется, только необходимо изменить реализацию. Например
    Код (Text):
    1. class ARRAY
    2. {
    3. public:
    4. // size и data - public, для упрощения
    5.   unsigned size;
    6.   int *data;
    7.   ARRAY();
    8.   ARRAY(unsigned);
    9.   ARRAY(unsigned, int *);
    10.   ARRAY(const ARRAY&);
    11.   ~ARRAY();
    12.   friend ARRAY operator+(const ARRAY&, const ARRAY&);
    13. };
    14.  
    15.  
    16. ARRAY::ARRAY()
    17. {
    18. //  std::cout << "ARRAY::ARRAY()" << std::endl;
    19.   size = 0;
    20.   data = NULL;
    21. }
    22.  
    23.  
    24. ARRAY::ARRAY(unsigned sz)
    25. {
    26. //  std::cout << "ARRAY::ARRAY(unsigned sz)" << std::endl;
    27.   data = NULL;
    28.   if (0 != (size = sz))
    29.     data = new int [sz];
    30.   if (NULL == data)
    31.     size = 0;
    32.   for (unsigned i = 0; i < size; i++)
    33.     data[i] = 0;
    34. }
    35.  
    36.  
    37. ARRAY::ARRAY(unsigned int sz, int *dt)
    38. {
    39. //  std::cout << "ARRAY::ARRAY(unsigned int sz, int *dt)" << std::endl;
    40.   data = NULL;
    41.   if (0 != (size = sz))
    42.     data = new int [sz];
    43.   if (NULL == data)
    44.     size = 0;
    45.   for (unsigned i = 0; i < size; i++)
    46.     data[i] = dt[i];
    47. }
    48.  
    49.  
    50. ARRAY::ARRAY(const ARRAY &ar)
    51. {
    52. //  std::cout << "ARRAY::ARRAY(const ARRAY &ar)" << std::endl;
    53.   if (0 != size)
    54.     delete [] data;
    55.   data = NULL;
    56.   if (0 != (size = ar.size))
    57.     data = new int [size];
    58.   if (NULL == data)
    59.     size = 0;
    60.   for (unsigned i = 0; i < size; i++)
    61.     data[i] = ar.data[i];
    62. }
    63.  
    64.  
    65. ARRAY::~ARRAY()
    66. {
    67. //  std::cout << "ARRAY::~ARRAY()" << std::endl;
    68.   size = 0;
    69.   if (NULL != data)
    70.     delete [] data;
    71.   data = NULL;
    72. }
    73.  
    74.  
    75. ARRAY operator+(const ARRAY& arg1, const ARRAY& arg2)
    76. {
    77. //  std::cout << "ARRAY operator+(const ARRAY& arg1, const ARRAY& arg2)" << std::endl;
    78.  
    79.   ARRAY result((arg1.size < arg2.size ? arg2.size : arg1.size));
    80.  
    81.   for (unsigned i=0; i < result.size; i++)
    82.     result.data[i] = (i < arg1.size ? arg1.data[i] : 0) +
    83.                      (i < arg2.size ? arg2.data[i] : 0);
    84.  
    85.   return result; // будет вызван ARRAY::ARRAY(const ARRAY&)
    86. }
     
  12. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    q_q

    Уже смешно))

    Ну да. Когда он мембер - одно из слагаемых - this.

    С чего это вдруг? Бугага))
     
  13. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    _DEN_
    С чего это вдруг?
    Визуальнее.
     
  14. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    «Классику надо знать» (с). Зря ты Страуструпа не любишь, дельные вещи пишет. Сейчас не вспомню страницу, но вот на эту же тему вырезка:
     
  15. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    IceStudent

    Объясняю по понятиям.

    q_q предлагает friend free-function. Страуструп предлагает free-function. Между ними существует огромная разница. Отношение дружбы - самая сильная связь в С++. Сильные связи это плохо. Страуструп предлагает free-function не потому что она "не мембер", а потому что простая free-function дает слабые связи. Степень связности - вот ключевое понятие урока. Мембер / не мембер это лишь повод, а не причина. Главная цель - понижение степени связности.

    Я вот не люблю Страуструпа, но при этом понимаю о чем он говорит. Некоторые, видимо, наоборот.

    Короче, фсем двойка.
     
  16. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    _DEN_
    q_q предлагает friend free-function.
    Я сделал ее friend, потому что в оригинальном варианте автора темы data и size над разделом public.
     
  17. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    _DEN_
    Не всё так плохо: C++ FAQ Lite: friends.
     
  18. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    IceStudent

    Назови мне хоть одну причину, по которой я должен считать собственное мнение менее авторитетным нежели то, что находится по твоей ссылке? :derisive:
     
  19. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    _DEN_
    А предоставляю альтернативу твоему мнению, а не оспариваю его. Вот если я буду топикстартером, тогда буду спорить)
     
  20. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Альтернатива подразумевает равноценный аналог. Ты меня практически обидел :)))))))