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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> проблема с дружественной функцией 
:(
    Опции темы
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   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

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


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

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


 




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


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

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