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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Приведение ко встроенному типу, Есть класс,нужно его привести~ к Double 
:(
    Опции темы
S3_
Дата 7.9.2009, 20:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Здравствуйте. Есть такая проблема. Класс complex с переменными real и imag, при перегрузкe friend double& operator= (const complex& c) что бы можно было присвоить типу Double свой тип Complex, вызывает ошибку operator= must be a non-static member. Вопрос заключается в том, как перегрузить знак "=" что бы Complex можно было присвоить какому либо типу (например тот же Double). Искал в интернете, толком ничего не нашел  smile . Вычитал что 
Цитата

No operator= can be declared as a nonmember function
, тоесть она должна быть функцией-членом класса? Как тогда сделать присвоение/преобразование типа???

Код

class complex
{
public:
    complex (double r, double i) { real = r; imag = i; }
    complex (complex& a) { real = a.real; imag = a.imag; }

//тут другие перегруженные операторы типа +, -, *, <<, >>, унарный минус и др.

    friend double& operator= (double& d, const complex& c);    //здесь error "operator= must be a non-static member"
//при выполнении "=" должно быть присвоение d=c.real
private:
    double real, imag;
};

double& operator= (double& d,const complex& c)
 {
    d=c.real;
    return d;
 }


Заранее спасибо за помощ  smile 

Это сообщение отредактировал(а) S3_ - 8.9.2009, 00:45
PM MAIL   Вверх
zim22
Дата 7.9.2009, 20:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


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

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



operator= не может быть friend.
он должен быть определён внутри класса.
***
можно определить свой оператор преобразования в тип double.
Код

operator double() {
  return 22.33;
}


Это сообщение отредактировал(а) zim22 - 7.9.2009, 20:55


--------------------
PM MAIL   Вверх
ller
Дата 7.9.2009, 21:04 (ссылка)    | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Из этого все равно ничего не выйдет. Компилятор в выражении d = c всегда будет пытаться преобразовать класс complex в double.
Причем средствани объекта double... А он ничего не подозревает о существовании complex 
PM MAIL   Вверх
zim22
Дата 7.9.2009, 21:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


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

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



Цитата(ller @  7.9.2009,  21:04 Найти цитируемый пост)
Из этого все равно ничего не выйдет. Компилятор в выражении d = c всегда будет пытаться преобразовать класс complex в double.

 smile 
Код

class complex
{
public:
    complex (double r, double i) { real = r; imag = i; }
    complex (complex& a) { real = a.real; imag = a.imag; }

    operator double() {
      return 22.33;
    }
private:
    double real, imag;
};

int main() {
  complex c(10, 20);
  double r = c;
}


Это сообщение отредактировал(а) zim22 - 7.9.2009, 21:10


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


Опытный
**


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

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



Обратное же работает

Код


complex& operator = (const double &d);  


complex& complex::operator = (const double &d)
 {
    re = d;
    im = 0;
    return *this;
 }


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


Эксперт
****


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

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



Цитата(zim22 @  7.9.2009,  21:10 Найти цитируемый пост)
return 22.33;

 smile 

 smile 
PM MAIL ICQ   Вверх
ller
Дата 7.9.2009, 21:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Хотя да. Оператор преобразования типа работает....  smile

Добавлено через 45 секунд
Код

    operator double() {
      return real;
    }


PM MAIL   Вверх
S3_
Дата 8.9.2009, 00:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Ура, работает этот оператор преобразования типа. Спасибо, я о нем думал как раз, вот только не знал как правильно реализовать smile Теперь double присваивается комплексное число  smile 

Спасибо за помощ  smile 
PM MAIL   Вверх
Леопольд
Дата 8.9.2009, 18:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(S3_ @  8.9.2009,  00:43 Найти цитируемый пост)
Ура, работает этот оператор преобразования типа.

Но не стоит переусердствовать с "пользовательскими" преобразаованиями. Так же надо помнить, что больше двух "пользовательских" преобразований за раз не допустимо. 

P.S.
Конструкторы, с одним аргументом, тоже "пользовательское" преобразование.

Это сообщение отредактировал(а) Леопольд - 8.9.2009, 18:19


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
IKM2007
Дата 8.9.2009, 18:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зима близко
**


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

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



Цитата(Леопольд @  8.9.2009,  18:07 Найти цитируемый пост)
Но не стоит переусердствовать с "пользовательскими" преобразаованиями.

Да и вообще не рекомендуется, так-как может привести к затруднениям, о которых вы и не можете подозревать. Например, для класса Complex вы должны  были обьявить оператор <<, чтобы напечатать число так: "(a, b)", но забыли определить оператор <<. Однако после компиляции увидели, что следующий код "работает":

Код

Complex x(1, 2);
std::cout<<x<<"\n";


На самом деле компилятор не находит обьявленный оператор << для аргумента типа Complex, и пытается найти последовательность операторов неявного преобразования, чтобы вызвать оператор <<, и находит приведение к типу  double, затем уже вызывает operator << для double. То есть мы вызвали не ту функцию, которую хотели бы вызвать, а это не хорошо. smile 


--------------------
"К чёрту обстоятельства, я создаю возможности."
Брюс Ли
PM MAIL Skype   Вверх
Леопольд
Дата 8.9.2009, 19:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Леопольд @  8.9.2009,  18:07 Найти цитируемый пост)
Так же надо помнить, что больше двух "пользовательских" преобразований за раз не допустимо. 

Больше одного, а не двух!

Добавлено через 46 секунд
Цитата(Леопольд @  8.9.2009,  18:07 Найти цитируемый пост)
Конструкторы, с одним аргументом, тоже "пользовательское" преобразование.

Если конечно он не объявлен как explicit


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
Леопольд
Дата 8.9.2009, 19:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(IKM2007 @  8.9.2009,  18:58 Найти цитируемый пост)
Да и вообще не рекомендуется

Я бы так не сказал, всё можно пользовать, только надо подходить правильно... Иногда это ОЧЕНЬ удобно, и вполне безопасно.
Код

#include <cstddef>
#include <iostream>

class BitSet{
    class Proxy{
        unsigned char& ref;
        const unsigned char shift;
    public:
        Proxy(unsigned char& ref_, const unsigned char shift_): ref(ref_), shift(shift_) {}

        operator const bool() const{
            return (ref & (1 << shift)) != 0;
        }
        Proxy& operator= (bool bit){
            if(bit)
                ref |= 1 << shift;
            else
                ref &= ~(1 << shift);
            return *this;
        }
        Proxy& operator= (const Proxy& rArg){
            *this = static_cast<const bool>(rArg);
            return *this;
        }
    };

    unsigned char byte;

public:

    BitSet(unsigned char byte_): byte(byte_) {}

    Proxy operator[](std::size_t i){
        return Proxy(byte, i);
    }
};

inline std::ostream& operator<<(std::ostream& out, const BitSet& bits){
    for(std::size_t i=7; i<8; --i)
        out<<const_cast<BitSet&>(bits)[i];
    return out;
}

int main()
{
    BitSet bits(0);
    bits[0] = 1;
    std::cout << "bits = "<<bits<<std::endl;
    bits[1] = bits[0];
    std::cout << "bits = "<<bits<<std::endl;
    return 0;
}



Это сообщение отредактировал(а) Леопольд - 8.9.2009, 20:45


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
IKM2007
Дата 8.9.2009, 19:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зима близко
**


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

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



Цитата(Леопольд @  8.9.2009,  18:07 Найти цитируемый пост)
 Так же надо помнить, что больше двух "пользовательских" преобразований за раз не допустимо. 


Цитата(Леопольд @  8.9.2009,  19:16 Найти цитируемый пост)
Больше одного, а не двух!


Цитата(Леопольд @  8.9.2009,  18:07 Найти цитируемый пост)
Конструкторы, с одним аргументом, тоже "пользовательское" преобразование.


Цитата(Леопольд @  8.9.2009,  19:16 Найти цитируемый пост)
Если конечно он не объявлен как explicit

Леопольд, Вы что спорите с самим собой?



--------------------
"К чёрту обстоятельства, я создаю возможности."
Брюс Ли
PM MAIL Skype   Вверх
Леопольд
Дата 8.9.2009, 19:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

bits = 00000001
bits = 00000011


Добавлено через 2 минуты и 6 секунд
Цитата(IKM2007 @  8.9.2009,  19:43 Найти цитируемый пост)
Леопольд, Вы что спорите с самим собой?

В споре рождается истина smile
Я просто поправил сам себя. Что бы не вводить никого в заблуждение.


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
IKM2007
Дата 8.9.2009, 19:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зима близко
**


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

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



Цитата(Леопольд @  8.9.2009,  19:41 Найти цитируемый пост)
Я бы так не сказал, всё можно пользовать, только надо подходить правильно... Иногда это ОЧЕНЬ удобно, и вполне безопасно.

Да, но врядли автор топика знает про proxy-классы, если задает такой вопрос. smile Можно вместо этого просто написать соответствущую функцию:

Код

class Complex
{
public:
...
double toDouble()const;
};

int main()
{
...
Complex a(1, 2);
std::cout<<a.toDouble()<<"\n";
}



--------------------
"К чёрту обстоятельства, я создаю возможности."
Брюс Ли
PM MAIL Skype   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

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


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

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


 




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


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

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