Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 20, средняя оценка - 4.65
Chelioss
180 / 180 / 4
Регистрация: 08.01.2011
Сообщений: 1,133
#1

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

03.09.2011, 20:35. Просмотров 2915. Ответов 28
Метки нет (Все метки)

Опечатался. Не работает явное преобразования, а не явное работает.
Есть класс( не обращайте внимание на члены данные класса ):
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), то будет ошибка: нет подходящего конструктора преобразования.

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

Явное преобразование типа в стиле С - C++
1) назовите направление преобразование ( из какого типа в какой ) 2) назовите точность преобразования (С потерей точности , без потери...

Неявное преобразование типа - C++
Привет. Решаю задачу, не могу решить проблему. Есть класс 'time' и производный от него класс 'interval'. 1 - содержит поля h, m, s,...

Неявное преобразование типа данных через структуры - C++
Помню что вроде был в С/С++ такой прием, который позволял посмотреть на содержимое переменной одного типа с точки зрения другого типа....

Как запретить компилятору неявное преобразование из числового типа в символьный? - C++
У мя возникла такая проблема: я ввожу данные типа char и мне надо быть уверенным, что я ввел именно символ, т.е. если я ввожу число мне...

Конструктор и декструктор, явное и неявное объявление - C++
Конструктор и декструктор, явное и неявное объявление? Подскажите где об этом можно почитать?

Явное преобразование типов - C++
class CLSObj { void abc(int d){ ... } ... }; int main() { char *p; CLSObj obj;

28
-=ЮрА=-
Заблокирован
Автор FAQ
03.09.2011, 21:26 #16
Цитата Сообщение от easybudda Посмотреть сообщение
CComplex c;
- не так, вот так CComplex a(4.5;-6.4),

Перд мэйн LPCCOMPLEX lpc = new CComplex();
не даром проект прикладывал Не работает явное преобразование типа, а неявное работает.

Добавлено через 3 минуты
Цитата Сообщение от Сыроежка Посмотреть сообщение
Я
- это последняя буква в алфавите, лучше коректно подбирать выссказывания, чтоб не было мучительно больно...
0
easybudda
Модератор
Эксперт CЭксперт С++
9695 / 5645 / 963
Регистрация: 25.07.2009
Сообщений: 10,848
03.09.2011, 21:29 #17
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Сыроежка Посмотреть сообщение
Я на этом форуме один из самых грамотных специалистов
Спасибо Вам за то, что Вы есть!
3
Сыроежка
Заблокирован
03.09.2011, 21:29 #18
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
- не так, вот так CComplex a(4.5;-6.4),

Перд мэйн LPCCOMPLEX lpc = new CComplex();
не даром проект прикладывал Не работает явное преобразование типа, а неявное работает.

Добавлено через 3 минуты
- это последняя буква в алфавите, лучше коректно подбирать выссказывания, чтоб не было мучительно больно...
Мучительно больн7о должно быть вам за вашу безграмотность и ваше чванство с вашим образованием. Можете жаловаться модераторам. Это будет в духе ваших человеческих качеств! Безграмотность - она всегда агрессивна!
0
easybudda
Модератор
Эксперт CЭксперт С++
9695 / 5645 / 963
Регистрация: 25.07.2009
Сообщений: 10,848
03.09.2011, 21:31 #19
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
не так, вот так CComplex a(4.5;-6.4),
Да без разницы, компилятор до этой строчки не доходит даже. Напиши сам, чтобы компилировалось...
0
talis
792 / 544 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
03.09.2011, 21:38 #20

Не по теме:

-=ЮрА=-, когда говорят "иметь совесть", хотят сказать совсем другое Пожалуйста, соблюдайте п.4 правил, хотя бы в той степени, в которой вы сами требуете этого в своей подписи.

Цитата Сообщение от Сыроежка Посмотреть сообщение
Я на этом форуме один из самых грамотных специалистов по с++
Хорошие новости: вы не умрёте от скромности!



Цитата Сообщение от Сыроежка Посмотреть сообщение
Это совершенно некорректный код, так как конструкторы не возвращают значения!
Сыроежка прав, так как у вас конструктор таки пытается вернуть значение:

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Разбираю по строкам
C++
1
2
3
4
5
6
7
Complex::Complex( double m_mod )
{
      CComplex ret_val;//ret_val.re = 0;ret_val.im = 0;
      ret_val.mod = m_mod;
      ret_val.arg  = 0;
      return ret_val; /* <<< ВОТ ЭТО ЕСТЬ ВОЗВРАЩЕНИЕ ИЗ КОНСТРУКТОРА */
}
0
-=ЮрА=-
Заблокирован
Автор FAQ
03.09.2011, 22:14 #21
Цитата Сообщение от easybudda Посмотреть сообщение
Да без разницы, компилятор до этой строчки не доходит даже. Напиши сам, чтобы компилировалось...
- в 6-ке всё компилиться, вот скрин дебага, экзешник тоже в проекте, так что в чём трабла ума не приложу
0
Миниатюры
Не работает явное преобразование типа, а неявное работает.  
easybudda
Модератор
Эксперт CЭксперт С++
9695 / 5645 / 963
Регистрация: 25.07.2009
Сообщений: 10,848
03.09.2011, 22:21 #22
-=ЮрА=-, ну а сам код будет? Только по возможности без windows.h а то у меня с ним не задалось как-то
0
-=ЮрА=-
Заблокирован
Автор 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
0
talis
792 / 544 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
03.09.2011, 22:41 #24
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Если не нравится windows.h - [...] - первая в winbase объявлена
Я подозреваю, что winbase может быть неудобен пользователям юниксов не меньше, чем windows.h
0
-=ЮрА=-
Заблокирован
Автор FAQ
03.09.2011, 22:44 #25
Цитата Сообщение от talis Посмотреть сообщение
Я подозреваю, что winbase может быть неудобен пользователям юниксов не меньше, чем windows.h
- ну тогда думаю лучше и проще выкинуть ветви с GetLastError
0
almazsr
232 / 169 / 7
Регистрация: 13.11.2010
Сообщений: 425
03.09.2011, 23:01 #26
-=ЮрА=-, зачем давать пользовательский класс для составления такого же (по функционалу) пользовательского класса?
Chelioss, я советую вам заменить поля класса (с модуля и аргумента на реальную и мнимую части).
0
-=ЮрА=-
Заблокирован
Автор FAQ
03.09.2011, 23:38 #27
Цитата Сообщение от almazsr Посмотреть сообщение
-=ЮрА=-, зачем давать пользовательский класс для составления такого же (по функционалу) пользовательского класса?
- реально не понял вопрос
0
CyBOSSeR
Эксперт С++
2304 / 1674 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
03.09.2011, 23:42 #28
Цитата Сообщение от Сыроежка Посмотреть сообщение
Вам просто нужно убрать из списка конструкторов первый конструктор.
Как раз таки только первый и нужно оставить:
C++
1
Complex(double r = 0.0, double i = 0.0);
1
Chelioss
180 / 180 / 4
Регистрация: 08.01.2011
Сообщений: 1,133
04.09.2011, 01:35  [ТС] #29
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Как раз таки только первый и нужно оставить:
C++
1
Complex(double r = 0.0, double i = 0.0);
Точно. Из трех конструктор достаточно одного.
0
04.09.2011, 01:35
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.09.2011, 01:35
Привет! Вот еще темы с ответами:

Явное преобразование типов в UST - C++
Задание - реализовать универсальный скалярный тип (аля any/variant из буста). Я его написал, однако преобразование типов в моем коде...

static_cast и явное преобразование типов - C++
Зачем нужен статик_каст, если можно явно преобразовывать типы?

неявное преобразование в C++ - C++
Здравствуйте! При работе с проектом на Qt, компилятор выдал ошибку: &quot;undefined reference to vtable&quot;. Порывшись в интернете, нашел статью,...

Неявное преобразование типов? - C++
есть класс Vector затем с его помощью создается класс Matrix (матрица - массив векторов) дошла очередь до операции умножения матрицы...


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

Или воспользуйтесь поиском по форуму:
29
Ответ Создать тему
Опции темы

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