Модераторы: 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   Вверх
Luyan
Дата 29.5.2009, 20:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



mes не работает ваш вариат, та же ошибка

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

Код

//Методы получения значения

int GetA () const { return a;}
int GetB () const { return b;}

// Методы присваивания значения

int SetA (int x)  { return a=x;}
int SetB (int x)  { return b=x;}


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


uploading...
****


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

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



mes

немного изменил код, сократил чтобы глаза не разбегались.

Код

#include <iostream>

class Fraction
{
public:
    Fraction() : i_(0)    {}
    Fraction(int v) : i_(v)    {}
    Fraction(Fraction& rhl) :i_(rhl.i_) {}
    friend Fraction operator + (Fraction r, Fraction l);
private:
    int i_;
};

Fraction operator + (Fraction r, Fraction l)
{
    return Fraction(r.i_ + l.i_);
}

int main()
{
    Fraction v1 = 1;
    Fraction v2 = 2;
    Fraction v3 = v1 + v2;
}

немного изменим вызов оператора
Код

Fraction v3(operator + (v1, v2));

в чем тут проблема, я не совсем понял..
передаем в оператор два обьекта по значению. т.е. вызывается конструктор копирования для класса Fraction, далее возвращает значение по значению. 

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


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


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

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



Цитата(azesmcar @  29.5.2009,  19:04 Найти цитируемый пост)
2. Мой "ненормальный откомпилировал" без единого варнинга smile (Visual Studio 2008)
раз у Вас такой всекомпилирующий компилятор, приведите пожалуйста лог этого кода :
Код

struct A
{
    int i;
    A() { std::cout <<"constructor"<<std::endl; }
    A(A& rhs)
    {  std::cout <<"copy-constructor"<<std::endl;
       i = rhs.i;
    }
    ~A()  { std::cout <<"destructor"<<std::endl; }
};

A operator + (A rhs, A lhs)
{
    A tmp;
    tmp.i = rhs.i+lhs.i;
    return tmp;
}
int main(void)
{

 {
   A a,b,c;
   c=a+b;
 }

  system ("pause");
  return 0;
}



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


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


uploading...
****


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

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



Цитата(mes @  29.5.2009,  20:24 Найти цитируемый пост)
раз у Вас такой всекомпилирующий компилятор, приведите пожалуйста лог этого кода :

Цитата

1>------ Build started: Project: testCpp, Configuration: Release Win32 ------
1>Compiling...
1>testCpp.cpp
1>Linking...
1>Generating code
1>Finished generating code
1>Embedding manifest...
1>Build log was saved at "file://d:\Workspace\testCpp\testCpp\Release\BuildLog.htm"
1>testCpp - 0 error(s), 0 warning(s)
========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========


Добавлено через 19 секунд
Вывел
Цитата

constructor
constructor
constructor
copy-constructor
copy-constructor
constructor
destructor
destructor
destructor
destructor
destructor
destructor


Добавлено через 1 минуту и 26 секунд
Прошу прощения...
а
Код

A f () { A a; return a; }


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


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


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

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



Цитата(azesmcar @  29.5.2009,  19:28 Найти цитируемый пост)
Пзачем это тут нужно? 

попала в результате копи паста из другого примера  smile 


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


uploading...
****


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

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



mes

А давайте все таки мой пример анализировать, он как-то более читабелен smile 

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


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


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

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



Цитата(azesmcar @  29.5.2009,  19:34 Найти цитируемый пост)
А давайте все таки мой пример анализировать, он как-то более читабелен smile 

Давайте ... свой пример я привел, чтоб убедиться в поведении VS. И судя по результату, она в которой раз проявила себя с дружественной к пользователю стороны, переступая через стандарт. 
smile
только я думаю для этого надо начать другую тему,чтоб не мешать тс разобраться со своей проблемой.


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


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


uploading...
****


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

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



mes

Код

int foo() {
    return int(1);
}

void f(int& a) {}

int main() {
    f(foo());
    return 0;
}

Visual Studio 2008
Выдает должную ошибку
Цитата

1>.\testCpp.cpp(21) : error C2664: 'f' : cannot convert parameter 1 from 'int' to 'int &'

заменяем int на какой нибудь класс
Код

class A {}

A foo() {
    return A();
}

void f(A& a) {}

int main() {
    f(foo());
    return 0;
}

Цитата

1>------ Build started: Project: testCpp, Configuration: Release Win32 ------
1>Compiling...
1>testCpp.cpp
1>Linking...
1>Generating code
1>Finished generating code
1>Embedding manifest...
1>Build log was saved at "file://d:\Workspace\testCpp\testCpp\Release\BuildLog.htm"
1>testCpp - 0 error(s), 0 warning(s)
========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========


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


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


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

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



Luyan, сократил пример до минимума,
это тоже дает ошибку ?
Код

struct A
{
    A() { }
    A(A const& rhs)   {  }
   ~A()  {  }
};

A operator + (A const & rhs, A const& lhs)
{
    A tmp;
    return tmp;
}

int main(void)
{
    A a,b,c;
    c=a+b;

  return 0;
}



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


Бывалый
*


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

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



Цитата

Luyan, сократил пример до минимума,
это тоже дает ошибку ?


нет, этот работает

Так что же мне изменить, чтобы в изначальном примере заработало?

и объясните, пожалуйста, почему всё работает с '*'('/') smile 

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


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


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

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



Цитата(Luyan @  29.5.2009,  20:01 Найти цитируемый пост)
нет, этот работает

тогда попробуйте еще раз так :
Код


using namespace std;

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

  return 0;
}



azesmcar, прошу Вас сюда пожаловать: http://forum.vingrad.ru/forum/act-ST/f-471...9/unread-1.html
чтоб смогли продолжить изучить вопрос возникший по отношению к VS 

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


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


uploading...
****


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

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



обсуждение переехало smile 

Добавлено через 10 минут и 36 секунд
Luyan

не надо себя мучать, скачайте нормальный компилятор. Шестую студию еще до Ноя создали, он ее на ковчег с собой брал чтобы не скучать в дороге.

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


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


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

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



Цитата(azesmcar @  29.5.2009,  20:23 Найти цитируемый пост)
должна ошибка быть. Это выазов копи-конструктора с неконстантной ссылко, а передается ему temporary object. Я то думаю о чем вы smile 

ага, об этом smile



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


Бывалый
*


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

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



Цитата

тогда попробуйте еще раз так :


mes, попробывал, всё равно эта ошибка

придётся качать VS 2008, кажется проблема решиться только так  smile 

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


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


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

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



ну тогда остается искать методом научного тыка smile
с закоментированными строками 24; 29; 30; у последнего примера опять ошибка ?



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


uploading...
****


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

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



Luyan

По моему если вы там только
int main() оставите он все равно будет ее выдавать, у вас проблема с самим компилятором..если создание нового проекта не помогает, его надо переинсталировать что ли..а вообще - правильно было бы поменять
PM   Вверх
mes
Дата 29.5.2009, 21:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(azesmcar @  29.5.2009,  20:38 Найти цитируемый пост)
По моему если вы там только
int main() оставите он все равно будет ее выдавать,

этот код http://forum.vingrad.ru/index.php?showtopi...t&p=1882413
ошибки не дает. smile



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


Бывалый
*


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

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



Цитата(mes @  29.5.2009,  21:37 Найти цитируемый пост)
с закоментированными строками 24; 29; 30;

нет, ошибки нет

Компилятор тогда ругался только на
Код

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


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


uploading...
****


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

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



Цитата(mes @  29.5.2009,  21:43 Найти цитируемый пост)
ошибки не дает. smile


Цитата

нет, этот работает

извиняюсь, этого не заметил

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


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


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

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



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

придётся качать VS 2008, кажется проблема решиться только так  smile 

ага, это более лучший вариант. судя по всему,
Цитата(azesmcar @  29.5.2009,  20:38 Найти цитируемый пост)
у вас проблема с самим компилятором

сам код не при чем.



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


Бывалый
*


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

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



вот  smile 

Код

#include <iostream>

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();
    friend Fraction operator+(Fraction,Fraction);
};

void Fraction::Show()
{
    std::cout  << a << "/" << b << std::endl;
}
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;
}


во всех других проектах класс был в заголовочном файле, а std - страшное зло smile 

PM   Вверх
mes
Дата 29.5.2009, 23:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Luyan @  29.5.2009,  22:07 Найти цитируемый пост)
во всех других проектах класс был в заголовочном файле, 

вместе с main () ?!
а также  получается , что когда Вам отдельные тестовые примеры давали, Вы их в общий проект пристыковывали ?! smile

Добавлено через 1 минуту и 31 секунду
вижу что делать const& в конструкторе и операторе не хотите .. чтож Ваше право  smile 


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


Бывалый
*


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

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



Цитата(Luyan @  29.5.2009,  23:07 Найти цитируемый пост)
во всех других проектах класс был в заголовочном файле


нет, это про другие проекты, которые здесь не озвучивались

как я понял, грамотно с const надо сделать так

Код

#include <iostream>

class Fraction
{
    int a;
    int b;
public:
    int GetA ()const;
    int GetB ()const;
    int SetA (int x); 
    int SetB (int x);
    void In();
    void Show();
    friend Fraction operator+(Fraction,Fraction);
};
 
int Fraction::GetA () const { return a;}
int Fraction::GetB () const { return b;}

int Fraction::SetA (int x)  { return a=x;}
int Fraction::SetB (int x)  { return b=x;}

void Fraction::Show()
{
    std::cout << a << "/" << b << std::endl;
}

void Fraction::In()
{
    int x,y;
    std::cin >> x;
    std::cin >> y;
    a=x;b=y;
}

Fraction operator+(Fraction ob1,Fraction ob2)
{
    Fraction tmp;
    tmp.a=ob1.GetA()*ob2.GetB()+ob2.GetA()*ob1.GetB();
    tmp.b=ob1.GetB()*ob2.GetB();
    return tmp;
}

int main()
{
    Fraction h1,h2,h3;
    std::cout << "#1" << std::endl;
    h1.In();
    std::cout << "#2" << std::endl;
    h2.In();
    h3=h1+h2;
    std::cout << std::endl;
    h3.Show();
    return 0;
}



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


uploading...
****


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

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



Цитата(Luyan @  29.5.2009,  23:17 Найти цитируемый пост)
как я понял, грамотно с const надо сделать так

Где вы тут const увидели вообще? Эти две функции?
PM   Вверх
mes
Дата 29.5.2009, 23:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Luyan @  29.5.2009,  22:17 Найти цитируемый пост)
Fraction operator+(Fraction ob1,Fraction ob2)

Код

Fraction operator+(Fraction const& ob1,Fraction const& ob2)

Код

Fraction (const& rhs)


Добавлено через 3 минуты и 2 секунды
Цитата(Luyan @  29.5.2009,  22:17 Найти цитируемый пост)
    int a;    int b;
  int x,y;

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

Добавлено через 3 минуты и 54 секунды
также как и для SetA GetA ... 


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


Бывалый
*


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

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



проблема решилась скачкой MVS 2008 Standard Edition  smile 
хотя и на старом компиляторе всё уже работало  smile 
вопрос снят, всем кто помогал спаибо! smile 
PM   Вверх
Страницы: (3) [Все] 1 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

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


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

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


 




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


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

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