Мое почтение всем. В колледже задали простенькую задачу -- перегрузить пару операторов в С++. Вроде, все сделал, но при использовании перегруженного оператора "+" происхожит обвал. Судя по дизасму, у временного объекта по каким-то причинам не вызывается конструктор. В результате, происходит попытка записи в неинициализированный член класса. P.s. Ассемблерные вставки не являются требованием -- сделал их просто от скуки, да и чтобы препод не расслаблялся . Попытка заменить их на С++ код ни к чему не привела. Код компилировался под MS VS 2005. Код можно посмотреть тут (аттачи не работают?) Заранее благодарен.
Mika0x65 Потому что size и data надо инициализировать во всех конструкторах, а не только в конструкторе по умолчанию. И юзай списки инициализации. Код - ужоснах.
Mika0x65 1) Какой конструктор должен быть вызван в ответ на ARRAY result(*max_ptr);? 2) Imho один аргумент твоего варианта operator+ не логичен. Я бы предпочел ARRAY ARRAY::operator+(const ARRAY& arg1, const ARRAY& arg2). Один аргумент логичен для operator+=.
_DEN_ Они и инициализируются во всех конструкторах. Код (Text): ARRAY::ARRAY() { size = 0; data = NULL; } ARRAY::ARRAY(unsigned int size) { this ->size = size; data = NULL; if (size) data = new int [size]; } + то, что на ассемблере. В чем заключается "ужоснаховость" кода? Это, конечно, не произведение искусства, но ничего жутокого я не вижу. q_q 1). Как я понимаю -- второй сверху из тех, что я привел выше. 2). Вы уверены, что так? MS VS говорит мне:
Mika0x65 Конструктор копирования посмотри. Не понял? Одного моего ультраавторитетного мнения уже не достаточно? )))))
а разве ARRAY result(*max_ptr); вызывает конструктор ARRAY::ARRAY(const ARRAY &array) ? ты же не по ссылке передаешь.
Mika0x65 operator + может быть членом класса, а может и не быть. В первом случае он имеет один параметр, во втором - два. В первом случае вторым параметром выступает *this. edit: орфография
_DEN_ Все там логично ... operator + может быть членом класса, а может и не быть Моя логика: оператор+ подразумевает три участника - слагаемые (два) и результат, оператор+= подразумевает два участника, один из которых является и результатом. Т.е. моя логика не в том где и сколько параметров, а в том, что оператор+ логичнее как friend function, а оператор+= - как member. Mika0x65 Вы уверены, что так? Разумеется, только необходимо изменить реализацию. Например Код (Text): class ARRAY { public: // size и data - public, для упрощения unsigned size; int *data; ARRAY(); ARRAY(unsigned); ARRAY(unsigned, int *); ARRAY(const ARRAY&); ~ARRAY(); friend ARRAY operator+(const ARRAY&, const ARRAY&); }; ARRAY::ARRAY() { // std::cout << "ARRAY::ARRAY()" << std::endl; size = 0; data = NULL; } ARRAY::ARRAY(unsigned sz) { // std::cout << "ARRAY::ARRAY(unsigned sz)" << std::endl; data = NULL; if (0 != (size = sz)) data = new int [sz]; if (NULL == data) size = 0; for (unsigned i = 0; i < size; i++) data[i] = 0; } ARRAY::ARRAY(unsigned int sz, int *dt) { // std::cout << "ARRAY::ARRAY(unsigned int sz, int *dt)" << std::endl; data = NULL; if (0 != (size = sz)) data = new int [sz]; if (NULL == data) size = 0; for (unsigned i = 0; i < size; i++) data[i] = dt[i]; } ARRAY::ARRAY(const ARRAY &ar) { // std::cout << "ARRAY::ARRAY(const ARRAY &ar)" << std::endl; if (0 != size) delete [] data; data = NULL; if (0 != (size = ar.size)) data = new int [size]; if (NULL == data) size = 0; for (unsigned i = 0; i < size; i++) data[i] = ar.data[i]; } ARRAY::~ARRAY() { // std::cout << "ARRAY::~ARRAY()" << std::endl; size = 0; if (NULL != data) delete [] data; data = NULL; } ARRAY operator+(const ARRAY& arg1, const ARRAY& arg2) { // std::cout << "ARRAY operator+(const ARRAY& arg1, const ARRAY& arg2)" << std::endl; ARRAY result((arg1.size < arg2.size ? arg2.size : arg1.size)); for (unsigned i=0; i < result.size; i++) result.data[i] = (i < arg1.size ? arg1.data[i] : 0) + (i < arg2.size ? arg2.data[i] : 0); return result; // будет вызван ARRAY::ARRAY(const ARRAY&) }
«Классику надо знать» (с). Зря ты Страуструпа не любишь, дельные вещи пишет. Сейчас не вспомню страницу, но вот на эту же тему вырезка:
IceStudent Объясняю по понятиям. q_q предлагает friend free-function. Страуструп предлагает free-function. Между ними существует огромная разница. Отношение дружбы - самая сильная связь в С++. Сильные связи это плохо. Страуструп предлагает free-function не потому что она "не мембер", а потому что простая free-function дает слабые связи. Степень связности - вот ключевое понятие урока. Мембер / не мембер это лишь повод, а не причина. Главная цель - понижение степени связности. Я вот не люблю Страуструпа, но при этом понимаю о чем он говорит. Некоторые, видимо, наоборот. Короче, фсем двойка.
_DEN_ q_q предлагает friend free-function. Я сделал ее friend, потому что в оригинальном варианте автора темы data и size над разделом public.
IceStudent Назови мне хоть одну причину, по которой я должен считать собственное мнение менее авторитетным нежели то, что находится по твоей ссылке?
_DEN_ А предоставляю альтернативу твоему мнению, а не оспариваю его. Вот если я буду топикстартером, тогда буду спорить)