Форум программистов, компьютерный форум CyberForum.ru

Не работает явное преобразование типа, а неявное работает. - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 20, средняя оценка - 4.65
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,131
03.09.2011, 20:35     Не работает явное преобразование типа, а неявное работает. #1
Опечатался. Не работает явное преобразования, а не явное работает.
Есть класс( не обращайте внимание на члены данные класса ):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Complex
{
    friend std::istream &operator>>( std::istream &, Complex & );
    friend std::ostream &operator<<( std::ostream &, const Complex & );
 
public:
    explicit Complex( double = 0.0, double = 0.0 );
    Complex( double );
 
    Complex operator*( const Complex & );
    Complex operator+( const Complex & );
    Complex operator-( const Complex & );
 
private:
    double mod; // модуль комплексного числа
    double arg; // аргумент комплексного числа
};
Вот реализация конструктора преобразования:
C++
1
2
3
4
Complex::Complex( double m_mod )
:mod( m_mod ), arg( 0 )
{
}
Вот функция main:
C++
1
2
3
4
5
6
7
8
9
10
#include "Complex.h"
 
int main()
{
    Complex comp = 999;
    std::cout << comp;
 
    system( "pause" );
    return 0;
}
Вот так программа работает, т.е. неявное преобразование типа от int к Complex работает.
А вот если вместо 999 написать Complex(999), то будет ошибка: нет подходящего конструктора преобразования.

В чем проблема?
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.09.2011, 20:35     Не работает явное преобразование типа, а неявное работает.
Посмотрите здесь:

C++ Как запретить компилятору неявное преобразование из числового типа в символьный?
Неявное преобразование переменных C++
C++ Неявное преобразование типов
C++ Неявное преобразование типа данных через структуры
C++ Неявное преобразование типа
C++ Явное преобразование типов
static_cast и явное преобразование типов C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
-=ЮрА=-
Заблокирован
Автор FAQ
03.09.2011, 22:14     Не работает явное преобразование типа, а неявное работает. #21
Цитата Сообщение от easybudda Посмотреть сообщение
Да без разницы, компилятор до этой строчки не доходит даже. Напиши сам, чтобы компилировалось...
- в 6-ке всё компилиться, вот скрин дебага, экзешник тоже в проекте, так что в чём трабла ума не приложу
Миниатюры
Не работает явное преобразование типа, а неявное работает.  
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9382 / 5432 / 916
Регистрация: 25.07.2009
Сообщений: 10,428
03.09.2011, 22:21     Не работает явное преобразование типа, а неявное работает. #22
-=ЮрА=-, ну а сам код будет? Только по возможности без windows.h а то у меня с ним не задалось как-то
-=ЮрА=-
Заблокирован
Автор FAQ
03.09.2011, 22:37     Не работает явное преобразование типа, а неявное работает. #23
Цитата Сообщение от talis Посмотреть сообщение
Сыроежка прав, так как у вас конструктор таки пытается вернуть значение:
Вот это хотел реализовать, вобщем не конструктор описывал, а фунцию
C++
1
CComplex Complex(double _re){CComplex ret_val;ret_val.re = _re; ret_val.im = 0;return ret_val;}
- писал быстро и немного бегло топик прочёл, так что думал речь о функции велась

Вот как выглядит класс который в качестве ознакомпления приводил

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class CComplex
{   
public:
    double re,im;   
    CComplex(){re = 0; im = 0;}
    CComplex(double _re, double _im){re = _re; im = _im;}
 
    CComplex operator+(double val);
    CComplex operator-(double val);
    CComplex operator*(double val);
    CComplex operator/(double val);
 
    CComplex operator+(CComplex& val);
    CComplex operator-(CComplex& val);
    CComplex operator*(CComplex& val);
    CComplex operator/(CComplex& val);
 
    double Re(CComplex val);
    double Im(CComplex val);
    CComplex ExpToAlg(double abs_val, double angle);
    CComplex AlgToExp(CComplex val);
    CComplex cmxpower(CComplex val, double power);
};
typedef CComplex *LPCCOMPLEX;
C++
1
2
CComplex(){re = 0; im = 0;} //конструктор по умолчанию
CComplex(double _re, double _im){re = _re; im = _im;} //конструктор преобразования
Добавлено через 5 минут
Цитата Сообщение от easybudda Посмотреть сообщение
=ЮрА=-, ну а сам код будет? Только по возможности без windows.h а то у меня с ним не задалось как-то
- в 12-м посте проект висит(уже кидал ссылку на него).Если не нравится windows.h - закоментируй ветви с GetLastError и strerror, или же подключи соответсвующие хедеры - первая в winbase объявлена, вторая в string.h
talis
 Аватар для talis
789 / 541 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
03.09.2011, 22:41     Не работает явное преобразование типа, а неявное работает. #24
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Если не нравится windows.h - [...] - первая в winbase объявлена
Я подозреваю, что winbase может быть неудобен пользователям юниксов не меньше, чем windows.h
-=ЮрА=-
Заблокирован
Автор FAQ
03.09.2011, 22:44     Не работает явное преобразование типа, а неявное работает. #25
Цитата Сообщение от talis Посмотреть сообщение
Я подозреваю, что winbase может быть неудобен пользователям юниксов не меньше, чем windows.h
- ну тогда думаю лучше и проще выкинуть ветви с GetLastError
almazsr
232 / 169 / 7
Регистрация: 13.11.2010
Сообщений: 425
03.09.2011, 23:01     Не работает явное преобразование типа, а неявное работает. #26
-=ЮрА=-, зачем давать пользовательский класс для составления такого же (по функционалу) пользовательского класса?
Chelioss, я советую вам заменить поля класса (с модуля и аргумента на реальную и мнимую части).
-=ЮрА=-
Заблокирован
Автор FAQ
03.09.2011, 23:38     Не работает явное преобразование типа, а неявное работает. #27
Цитата Сообщение от almazsr Посмотреть сообщение
-=ЮрА=-, зачем давать пользовательский класс для составления такого же (по функционалу) пользовательского класса?
- реально не понял вопрос
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2295 / 1665 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
03.09.2011, 23:42     Не работает явное преобразование типа, а неявное работает. #28
Цитата Сообщение от Сыроежка Посмотреть сообщение
Вам просто нужно убрать из списка конструкторов первый конструктор.
Как раз таки только первый и нужно оставить:
C++
1
Complex(double r = 0.0, double i = 0.0);
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.09.2011, 01:35     Не работает явное преобразование типа, а неявное работает.
Еще ссылки по теме:

C++ Неявное преобразование типов?
Конструктор и декструктор, явное и неявное объявление C++
C++ Неявное преобразование типов
C++ Явное преобразование типов в UST
C++ Явное преобразование типов данных(объясните разницу)!

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,131
04.09.2011, 01:35  [ТС]     Не работает явное преобразование типа, а неявное работает. #29
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Как раз таки только первый и нужно оставить:
C++
1
Complex(double r = 0.0, double i = 0.0);
Точно. Из трех конструктор достаточно одного.
Yandex
Объявления
04.09.2011, 01:35     Не работает явное преобразование типа, а неявное работает.
Ответ Создать тему
Опции темы

Текущее время: 23:01. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru