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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> проблема с дружественной функцией 
:(
    Опции темы
Luyan
Дата 29.5.2009, 19:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



давно юзаю дружественные функции, но возникла проблема

вот очень простой пример
Код

#include <iostream>
using namespace std;
class Fraction
{
private:
    int a;
    int b;
public:
    Fraction(){a=0;b=0;}
    Fraction(Fraction& c)
    {
        a=c.a;
        b=c.b;
    }
    Fraction(int x, int y)
    {
        a=x;
        b=y;
    }
    void Show()
    {
        cout  << a << "/" << b << endl;
    }
    friend Fraction operator+(Fraction,Fraction);
};
Fraction operator+(Fraction ob1,Fraction ob2)
{
    Fraction i;
    i.a=ob1.a*ob2.b+ob2.a*ob1.b;
    i.b=ob1.b*ob2.b;
    return i;
}
int main()
{
    Fraction h1(2,2),h2(2,2),h3;
    h3=h1+h2;
    h3.Show();
    return 0;
}


компилятор посылает меня куда то в тех поддержку:

Compiling...
main.cpp
E:\Zad\fraction\main.cpp(25) : fatal error C1001: INTERNAL COMPILER ERROR
        (compiler file 'msc1.cpp', line 1786) 
         Please choose the Technical Support command on the Visual C++ 
         Help menu, or open the Technical Support help file for more information
Error executing cl.exe.

fraction.exe - 1 error(s), 0 warning(s)


А если поменять знак '+', например, на знак '*'  в объявлении, определении функции и в майне, то всё зароботает.
В чём проблема? уже перегружал дружественной функцией оператор '+', но такого типа ошибка впервые. 
PM   Вверх
mes
Дата 29.5.2009, 19:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



прежде всего напрашивается вопрос, а где копи-конструктор ?  smile
если это:
  Fraction(Fraction& c) то там не хватает квалификатора const smile 

Это сообщение отредактировал(а) mes - 29.5.2009, 23:17


--------------------
PM MAIL WWW   Вверх
azesmcar
Дата 29.5.2009, 19:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

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



Цитата(mes @  29.5.2009,  19:24 Найти цитируемый пост)
прежде всего напрашивается вопрос, а где копи-конструктор ? 


Цитата(Luyan @  29.5.2009,  19:16 Найти цитируемый пост)

Fraction(Fraction& c)
{
     a=c.a;
     b=c.b;
}

а это что? smile 

Luyan
1. Какая версия студии?
2. попробуйте перезапустить компилятор
3. попробуйте создать проект снова
сам код - с точки зрения С++ нормальный. А вообще - не очень грамотно написан.


Это сообщение отредактировал(а) azesmcar - 29.5.2009, 19:35
PM   Вверх
mes
Дата 29.5.2009, 19:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(azesmcar @  29.5.2009,  18:33 Найти цитируемый пост)
а это что? smile 

это конструктор по ссылке smile

Это сообщение отредактировал(а) mes - 29.5.2009, 23:17


--------------------
PM MAIL WWW   Вверх
azesmcar
Дата 29.5.2009, 19:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

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



Цитата(mes @  29.5.2009,  19:34 Найти цитируемый пост)
это конструктор по ссылке smile

вы имеете ввиду что ссылка неконстантная?? это конечно странно в данном контексте, но вполне законно..и это считается копи-конструктором.
Для примера - копи конструктор std::auto_ptr принимает неконстантную ссылку.

Это сообщение отредактировал(а) azesmcar - 29.5.2009, 19:36
PM   Вверх
mes
Дата 29.5.2009, 19:39 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(azesmcar @  29.5.2009,  18:36 Найти цитируемый пост)
вы имеете ввиду что ссылка неконстантная?? это конечно странно в данном контексте, но вполне законно.

а теперь посмотрите, что получается при прибавлении в таком случае - ссылка на временный объект  smile

Добавлено @ 19:41
Цитата(azesmcar @  29.5.2009,  18:36 Найти цитируемый пост)
Для примера - копи конструктор std::auto_ptr принимает неконстантную ссылку.

у std::auto_ptr нет копи-конструктора, и именно это является причиной, почему компилятор отказывается помещать в std::контейнер. 
у std::auto_ptr нет константного копи-конструктора, и именно это является причиной, почему компилятор отказывается помещать в std::контейнер. smile

Это сообщение отредактировал(а) mes - 29.5.2009, 23:16


--------------------
PM MAIL WWW   Вверх
Luyan
Дата 29.5.2009, 19:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата

1. Какая версия студии?
2. попробуйте перезапустить компилятор
3. попробуйте создать проект снова


1. Microsoft Visual C++ 6.0
2. Перезапускал
3. Пересоздавал проект
Ничего нового не произошло.

главное не понятно, в других проектах  перегруженный дружественной функцией operator+ работает smile 
PM   Вверх
mes
Дата 29.5.2009, 19:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(Luyan @  29.5.2009,  18:44 Найти цитируемый пост)
Ничего нового не произошло.

поставьте все таки const и проверьте еще раз smile


--------------------
PM MAIL WWW   Вверх
zim22
Дата 29.5.2009, 19:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


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

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



Цитата(Luyan @  29.5.2009,  19:44 Найти цитируемый пост)
Ничего нового не произошло.

Код

friend Fraction operator+(const Fraction&, const Fraction&);


Это сообщение отредактировал(а) zim22 - 29.5.2009, 19:51


--------------------
PM MAIL   Вверх
azesmcar
Дата 29.5.2009, 19:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

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



Цитата(mes @  29.5.2009,  19:39 Найти цитируемый пост)
а теперь посмотрите, что получается при прибавлении в таком случае - ссылка на временный объект  smile

Не совсем понял о чем речь.

Цитата(mes @  29.5.2009,  19:39 Найти цитируемый пост)
у std::auto_ptr нет копи-конструктора, и именно это является причиной, почему компилятор отказывается помещать в std::контейнер. smile

Код

template<class _Ty>
    class auto_ptr
        {    // wrap an object pointer to ensure destruction
public:
    typedef _Ty element_type;

    explicit auto_ptr(_Ty *_Ptr = 0) _THROW0()
        : _Myptr(_Ptr)
        {    // construct from object pointer
        }

    auto_ptr(auto_ptr<_Ty>& _Right) _THROW0()
        : _Myptr(_Right.release())
        {    // construct by assuming pointer from _Right auto_ptr
        }

и как тогда работает вот это?
Код

std::auto_ptr<int> t(new int());
std::auto_ptr<int> p = t;

Цитата(Standard)

A copy constructor for a class X is a constructor with a first parameter of type X& or of type const X&.


Цитата(Luyan @  29.5.2009,  19:44 Найти цитируемый пост)
1. Microsoft Visual C++ 6.0

источник всех бед smile 
что вы нормальный компилятор то не скачаете?
INTERNAL COMPILER ERROR - внутреняя ошибка, либо вы написали что-то, чем сильно смутили компилятор, либо у него просто критические дни. Может быть и то и другое, критические дни у смущенного компилятора - это слишком.

Это сообщение отредактировал(а) azesmcar - 29.5.2009, 20:00
PM   Вверх
mes
Дата 29.5.2009, 19:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Посмотрел в стандарт, действительно и то и другое (с константной ссылкой и с простой) называется copy-constructor. Признаю ошибку.
Однако это не отменяет того, что при данной схеме должен быть "константный" копи--конструктор.



--------------------
PM MAIL WWW   Вверх
azesmcar
Дата 29.5.2009, 20:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

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



Цитата(mes @  29.5.2009,  19:59 Найти цитируемый пост)
Однако это не отменяет того, что при данной схеме должен быть "константный" копи--конструктор.

ну да, не помешал бы...да и передавать по ссылке параметры оператору + как сказал zim22.
но компилятор это все равно не оправдывает, код должен был откомпилироваться
PM   Вверх
mes
Дата 29.5.2009, 20:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(azesmcar @  29.5.2009,  18:51 Найти цитируемый пост)
а теперь посмотрите, что получается при прибавлении в таком случае - ссылка на временный объект  smile

Не совсем понял о чем речь.

то что получается следующее
Код

struct A
{
  A() {}
  A (A&) {}
};
A f ();

A a(f()); // <<--

и ни один нормальный компилятор такое не откомпилирует. 




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


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

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



Вообще конструктор копирования НАДО писать по возможности константным. Один неконстантный конструктор копирования за собой цепочку потащит.

Добавлено через 1 минуту и 51 секунду
Цитата(mes @  29.5.2009,  20:03 Найти цитируемый пост)
то что получается следующее

Уже интереснее smile 
1. Я честно говоря весь код не смотрел
2. Мой "ненормальный откомпилировал" без единого варнинга smile (Visual Studio 2008)

сейчас загляну в код, что же там такое написано
PM   Вверх
mes
Дата 29.5.2009, 20:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Luyan,ловите исправленый вариант :
Код

//..
class Fraction
{
private:
    int a;
    int b;
public:
    Fraction(){a=0;b=0;}
    Fraction(Fraction const& c)
    {
        a=c.a;
        b=c.b;
    }
    Fraction(int x, int y)
    {
        a=x;
        b=y;
    }
    void Show()
    {
        cout  << a << "/" << b << endl;
    }
    friend Fraction operator+(Fraction const&,Fraction const &);
};
Fraction  operator+(Fraction const & ob1,Fraction const& ob2)
{
    Fraction tmp;
    tmp.a=ob1.a*ob2.b+ob2.a*ob1.b;
    tmp.b=ob1.b*ob2.b;
    return tmp;
}
int main(void)
{

    Fraction h1(2,2),h2(2,2),h3;
    h3=h1+h2;
    h3.Show();
//...


Это сообщение отредактировал(а) mes - 29.5.2009, 20:10


--------------------
PM MAIL WWW   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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