Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> перегрузка операций 
V
    Опции темы
serendip
Дата 27.1.2006, 02:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 20.12.2005

Репутация: нет
Всего: нет



Здравствуйте! smile
Кто-нибудь видит что-нибудь нехорошее в этих перегрузках?
Код

DMass::DMass(int m)
{  n=m;
   d=StrToInt(Form2->Edit3->Text);
   a=new float[n];
}
 DMass& DMass::operator=(const DMass &v)
 {
   for (int i=0; i<n; i++)
     a[i]=v.a[i];
      return *this;
 }

 DMass DMass::operator~()const
 { DMass rr(n);
           for (int i=0; i<n; i++)
           rr.a[i]= a[i]-d;
         return rr;
 }
....
DMass x(n);
   ...
     x=~x;

Работает(вторая) совсем непонятно, вадаёт один и тот же неожидаемый рез-т
(1,35244; 1,35244; 0; 0; ...0) И при повторном запуске ошибку(куда-то чего-то не по тому адресу)
PM MAIL ICQ   Вверх
JackYF
Дата 27.1.2006, 03:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



что такое DMass?
полный код в студию...

во второй функции не предусмотрено, мне кажется, разных размеров - откуда ты уверен, что они совпадают - опять же таки полный код DMass.

что такое переменная d и чему она равна (или может быть равна?)




--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
threef
Дата 27.1.2006, 11:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 375
Регистрация: 27.10.2005
Где: Запорожье

Репутация: 9
Всего: 10



Цитата

Код

 DMass& DMass::operator=(const DMass &v)
 {
   for (int i=0; i<n; i++)
     a[i]=v.a[i];
      return *this;
 }





Я думаю здесь:
for (int i=0; i<n; i++)

i<n ?
либо i<v.n
либо
this->resize(v.getsize());

PM MAIL   Вверх
serendip
Дата 27.1.2006, 22:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 20.12.2005

Репутация: нет
Всего: нет



Итаак...
Код

class DMass
{    float* a;
        int n;
        float d;
       float step(float,float);
public:
        DMass(int = 1);
       ~DMass();
        void vvod1();
        void vvod2();
        void vivod1();
        void vivod2();
        DMass& operator=(const DMass&) ;
        DMass operator^(const DMass&) const; 
        DMass operator~()const;
};
//---------------------------------------------------------------------------
DMass::DMass(int m)
{  n=m;
   d=StrToFloat(Form2->Edit3->Text);
   a=new float[n];
}

Перегрузка та же. Есть ещё одна перегрузка, но она выдает точно такой же результатsmile
Код

DMass DMass::operator^(const DMass &v)const  
{ DMass f(n);
   for (int i=0; i<n; i++)
         f.a[i]=step(a[i],v.a[i]);

         return f;
}


Размер массивов всегда совпадает(так задумывалось)
Переменная d - просто обычное число, которое нужно вычесть из каждого эл-та массива.
Причём, без перегрузок"^"и"~" пр-мма работает нормально - всё вводит, выводит и даже присваивает объекты (т.е. срабатывает перегр. "=", я надеюсь)
Цитата

Я думаю здесь:
for (int i=0; i<n; i++)

i<n ?
либо i<v.n
либо
this->resize(v.getsize());

- не помогает.
Такая загадка... smile smile[code=cpp]

Это сообщение отредактировал(а) serendip - 27.1.2006, 22:29
PM MAIL ICQ   Вверх
BreakPointMAN
Дата 28.1.2006, 00:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 15.9.2004
Где: Saratov

Репутация: 14
Всего: 24



Итак, для начала... smile Твой класс имеет члены-указатели:
Код

class DMass
{    float* a;
...

а в конструкторе ты выделяешь динамически память:
Код

DMass::DMass(int m)
{  n=m;
   d=StrToFloat(Form2->Edit3->Text);
   a=new float[n];
}

Это означает, что должны быть соответствующим образом определены деструктор данного класса, а также конструктор копирования и операция присваивания. В деструкторе ты должен высвобождать выделенную конструктором память (используя delete), а копировать и присваивать объекты данного класса нужно создавая в каждом из них "свои" динамические данные..

Оператор присваивания у тебя уже определен неверно:
Код

 DMass& DMass::operator=(const DMass &v)
 {
   for (int i=0; i<n; i++)
     a[i]=v.a[i];
      return *this;
 }



--------------------
"Разруха не в клозетах, а в головах." © Ф.Ф. Преображенский (М.Булгаков, "Собачье сердце")
PM WWW ICQ   Вверх
serendip
Дата 28.1.2006, 00:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 20.12.2005

Репутация: нет
Всего: нет



...ну что вам сказать...smile
ничего не понятно, кроме деструктораsmile
Могу только ответить:"А в учебнике так!":)
Т.е вы хотите сказать, что в "=" нужно создавать ещё один объект?
PM MAIL ICQ   Вверх
BreakPointMAN
Дата 28.1.2006, 00:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 15.9.2004
Где: Saratov

Репутация: 14
Всего: 24



Цитата(serendip @ 28.1.2006, 00:35 Найти цитируемый пост)

Могу только ответить:"А в учебнике так!":)

Либо в учебнике не так (например, нет выделения памяти с помощью new), либо учебник на свалку... smile
Цитата(serendip @ 28.1.2006, 00:35 Найти цитируемый пост)

Т.е вы хотите сказать, что в "=" нужно создавать ещё один объект?

Т.е. хочу сказать, что сначала нужно немного почитать про копирование и присваивание, конструкторы и деструкторы... smile


--------------------
"Разруха не в клозетах, а в головах." © Ф.Ф. Преображенский (М.Булгаков, "Собачье сердце")
PM WWW ICQ   Вверх
serendip
Дата 28.1.2006, 00:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 20.12.2005

Репутация: нет
Всего: нет



smile Не могу уже читать, так меня всё это досталоsmile
Архангельскийsmile
PM MAIL ICQ   Вверх
BreakPointMAN
Дата 28.1.2006, 01:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 15.9.2004
Где: Saratov

Репутация: 14
Всего: 24



Цитата(serendip @ 28.1.2006, 00:59 Найти цитируемый пост)

Архангельский

Архангельский для изучения среды C++ Builder хорош, но никак не для изучения языка C++... smile А понятия "конструктор", "деструктор" и пр. - это язык... Так что книгу по C++ в руки ... и читать! smile


--------------------
"Разруха не в клозетах, а в головах." © Ф.Ф. Преображенский (М.Булгаков, "Собачье сердце")
PM WWW ICQ   Вверх
serendip
Дата 28.1.2006, 10:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 20.12.2005

Репутация: нет
Всего: нет



smile Я в курсе, что такое конструктор и деструктор,
а вот
Цитата

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

и
Цитата

присваивать объекты данного класса нужно создавая в каждом из них "свои" динамические данные..

- не совсем понимаю..Думается мне, что в данном случае в этом нет необходимости.
Но мне очень необходмо понять, почему не работают перегрузки!smile
При объявлении объекта я каждый раз создаю в нём свои динамические данные, разве не так?
PM MAIL ICQ   Вверх
Fin
Дата 28.1.2006, 10:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дракон->Спать();
**


Профиль
Группа: Участник
Сообщений: 687
Регистрация: 4.1.2006

Репутация: 3
Всего: 10



Скрытая логическая ошибка (в класофикации граблей № 2):
Код

DMass DMass::operator~()const
 { DMass rr(n);
           for (int i=0; i<n; i++)
           rr.a[i]= a[i]-d;
         return rr;
 }


В функции создается статический объект, при выходе из функции объект автоматически уничтожается. И ссылка на него некоретна.


--------------------
Пролетал мимо.
PM MAIL   Вверх
Daevaorn
Дата 28.1.2006, 10:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Цитата(Fin @ 28.1.2006, 10:42 Найти цитируемый пост)

В функции создается статический объект, при выходе из функции объект автоматически уничтожается. И ссылка на него некоретна.

Приглядись, там нет ссылки.
PM MAIL WWW   Вверх
Fin
Дата 28.1.2006, 10:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дракон->Спать();
**


Профиль
Группа: Участник
Сообщений: 687
Регистрация: 4.1.2006

Репутация: 3
Всего: 10



Это что return rr Да это не ссылка на объект. Но вывод за пределы функции результатов убитого уже экземпляра объекта.


--------------------
Пролетал мимо.
PM MAIL   Вверх
Daevaorn
Дата 28.1.2006, 11:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Fin
Тогда по твоей логике

Код

int f()
{
   return 123;
}


тоже не коректно?smile
PM MAIL WWW   Вверх
Fin
Дата 28.1.2006, 11:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дракон->Спать();
**


Профиль
Группа: Участник
Сообщений: 687
Регистрация: 4.1.2006

Репутация: 3
Всего: 10



Коректно. Компилятор скорее всего сделает такую последовательность команд аcсемблера.

Код

   mov ax,7B
   ret


Это сообщение отредактировал(а) Fin - 28.1.2006, 11:13


--------------------
Пролетал мимо.
PM MAIL   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1022 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.