Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.92/25: Рейтинг темы: голосов - 25, средняя оценка - 4.92
186 / 186 / 21
Регистрация: 08.01.2011
Сообщений: 1,139
1

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

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

Author24 — интернет-сервис помощи студентам
Опечатался. Не работает явное преобразования, а не явное работает.
Есть класс( не обращайте внимание на члены данные класса ):
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)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.09.2011, 20:35
Ответы с готовыми решениями:

Явное и неявное преобразование типов
Явное и неявное преобразование типов.

Явное или неявное приведение типа
Здравствуйте. Смотрю код других разработчиков и замечаю, что часто они явно приводят типы там, где...

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

Неявное преобразование типа
Привет. Решаю задачу, не могу решить проблему. Есть класс 'time' и производный от него класс...

28
Бродяга
314 / 268 / 56
Регистрация: 27.08.2010
Сообщений: 553
03.09.2011, 20:44 2
При таком вызове Complex(999) будет неоднозначность, т.к имеется два кандидата:

C++
1
2
explicit Complex( double = 0.0, double = 0.0 );
Complex( double );
1
186 / 186 / 21
Регистрация: 08.01.2011
Сообщений: 1,139
03.09.2011, 20:48  [ТС] 3
Вот блин. Вторую строчку ошибки не прочитал.
Я думал, что спецификатор explicit все решит.
Мою ошибку исправить так:
C++
1
2
Complex( double = 0.0, double = 0.0 );
Complex( double );
переписать на
C++
1
2
3
Complex(){ mod =0, arg = 0};
Complex( double, double );
Complex( double );
Это единственный вариант? Можно как-нибудь по другому исправить мою ошибку?
0
Заблокирован
Автор FAQ
03.09.2011, 20:50 4
Цитата Сообщение от Chelioss Посмотреть сообщение
Есть класс( не обращайте внимание на члены данные класса ):
-
Сделай вот так
C++
1
2
3
4
5
6
7
Complex::Complex( double m_mod )
{
      CComplex ret_val;
      ret_val.mod = m_mod;
      ret_val.arg  = 0;
      return ret_val;
}
В твоём посте о комплексных числах уже привёл целый готовый и работоспособный класс
Стандартный класс complex.
1
Заблокирован
03.09.2011, 20:55 5
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
-
Сделай вот так
C++
1
2
3
4
5
6
7
Complex::Complex( double m_mod )
{
      CComplex ret_val;
      ret_val.mod = m_mod;
      ret_val.arg  = 0;
      return ret_val;
}
В твоём посте о комплексных числах уже привёл целый готовый и работоспособный класс
Стандартный класс complex.
Это совершенно некорректный код, так как конструкторы не возвращают значения!

Добавлено через 49 секунд
Цитата Сообщение от Chelioss Посмотреть сообщение
Вот блин. Вторую строчку ошибки не прочитал.
Я думал, что спецификатор explicit все решит.
Мою ошибку исправить так:
C++
1
2
Complex( double = 0.0, double = 0.0 );
Complex( double );
переписать на
C++
1
2
3
Complex(){ mod =0, arg = 0};
Complex( double, double );
Complex( double );
Это единственный вариант? Можно как-нибудь по другому исправить мою ошибку?
У вас все равно сохранится неоднозначность. Вам просто нужно убрать из списка конструкторов первый конструктор.
0
186 / 186 / 21
Регистрация: 08.01.2011
Сообщений: 1,139
03.09.2011, 20:59  [ТС] 6
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
В твоём посте о комплексных числах уже привёл целый готовый и работоспособный класс
Я сам хочу написать, ибо опыт то получать надо. Да и ваш не подходит потому, что в моем тупом задании комплексный класс совсем по другому себя ведет.

static_cast< Complex > (999) - так можно преобразовать int к Complex, но почему в моем классе это неоднозначность, если у меня перед первым конструктором стоит спецификатор explicit, который запрещает использовать этот конструктор при преобразовании типа?
Да и Complex complex = Complex(999) - это ведь тоже преобразования типа или нет? В любом случае static_cast не работает, хотя есть спецификатор explicit.

Добавлено через 2 минуты
Цитата Сообщение от Сыроежка Посмотреть сообщение
У вас все равно сохранится неоднозначность. Вам просто нужно убрать из списка конструкторов первый конструктор.
Нет, только что проверил. Да и вы сам где видите неоднозначность? Выбирается тот конструктор у которого 1 параметр.
0
Заблокирован
Автор FAQ
03.09.2011, 21:00 7
Цитата Сообщение от Сыроежка Посмотреть сообщение
Это совершенно некорректный код, так как конструкторы не возвращают значения!
- внимательно изучи мой код, а потом замечания делай

C++
1
2
3
4
5
6
class CComplex
{       
public:
        double re,im;   
        CComplex(){re = 0; im = 0;}
        CComplex(double _re, double _im){re = _re; im = _im;}
Разбираю по строкам
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;
}
1
Заблокирован
03.09.2011, 21:00 8
Цитата Сообщение от Chelioss Посмотреть сообщение
Я сам хочу написать, ибо опыт то получать надо. Да и ваш не подходит потому, что в моем тупом задании комплексный класс совсем по другому себя ведет.

static_cast< Complex > (999) - так можно преобразовать int к Complex, но почему в моем классе это неоднозначность, если у меня перед первым конструктором стоит спецификатор explicit, который запрещает использовать этот конструктор при преобразовании типа?
Да и Complex complex = Complex(999) - это ведь тоже преобразования типа или нет? В любом случае static_cast не работает, хотя есть спецификатор explicit.
static_cast<complex>( 999 ) вызывает конструктор complex( 999 ). Я вам уже сказал, что вам надо выкинуть конструктор, где вы устанавливаете аргументы по умолчанию. Это логически неверно, так как у вас есть конструктор с одним аргументом. Вам скорей всего радо создать конструктор по умолчанию к вашему списку конструкторов, где обе части комплексного числа будут положены равуными 0.
1
Заблокирован
03.09.2011, 21:02 9
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
- внимательно изучи мой код, а потом замечания делай

C++
1
2
3
4
5
6
class CComplex
{       
public:
        double re,im;   
        CComplex(){re = 0; im = 0;}
        CComplex(double _re, double _im){re = _re; im = _im;}
Разбираю по строкам
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;
}
Я вам второй раз повторяю, что конструкторы не возвращают значения!
1
186 / 186 / 21
Регистрация: 08.01.2011
Сообщений: 1,139
03.09.2011, 21:07  [ТС] 10
Все, я понял. Я плохо запомнил из книги, что делает explicit.
Оказывается он подавляет только неявные преобразования, т.е.
код Complex complex = 999 работает, т.к. тут неявное преобразования, а из-за того, что есть explicit, один из конструкторов запрещается и остается только оставшийся.
А тут Complex complex = Complex(999) не работает, т.к. explicit не подавляет явное преобразование.

Кстати говоря, в книге Дейтелов написано, что explicit можно применять только к конструктору с одним аргументом, ибо будет ошибка компиляции. А вот Visual Studio 2008 позволяет использовать explicit к конструктору с двумя аргументами.
0
Заблокирован
Автор FAQ
03.09.2011, 21:07 11
Цитата Сообщение от Сыроежка Посмотреть сообщение
Я вам второй раз повторяю, что конструкторы не возвращают значения!
- Вот готовый проект, который был защищён в институте, настоятельно рекомендую всё изучить!!!

Цитата Сообщение от Сыроежка Посмотреть сообщение
конструкторы не возвращают значения!
- конструктор возвращает объект первоначально инициализированный, этот объект можно переинициализировать...
Вложения
Тип файла: rar tema_4.rar (37.2 Кб, 10 просмотров)
0
Заблокирован
03.09.2011, 21:09 12
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
- Вот готовый проект, который был защищён в институте, настоятельно рекомендую всё изучить!!!

- конструктор возвращают объект первоначально инициализированный, этот объект можно переинициализировать...
Меня не интересует ваш проект, защищенный в институте. В вашем институте такие же безграмотные преподаватели, как на этом форуме модераторы. Читайте не доморощенные проекты, а читайте стандарт языка С++!
0
Заблокирован
Автор FAQ
03.09.2011, 21:18 13
Цитата Сообщение от Сыроежка Посмотреть сообщение
В вашем институте такие же безграмотные преподаватели, как на этом форуме модераторы.
- Во первых я окнчил ВУЗ с 5-м наивысшим уровнем аккредитации магистром с отличием, пусть и по другой специальности, не ВТ, во вторых дорости сначала до рейтинга сообщений, чтобы на равных говорить, в третьих, рекомендую прочесть п.4 правил форума, прежде чем гнать на модераторов и его участников, конешно если всё же хочешь на нём учавствоватьИ вобще кумарят выскочки которые возомнили, что центры вселенной и кроме ни никто не умеет программировать - проект привёл как наглядный пример - нет желания его изучать, тогда рекомендую изучить литературу по С!
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12458 / 7482 / 1753
Регистрация: 25.07.2009
Сообщений: 13,762
03.09.2011, 21:21 14
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
внимательно изучи мой код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class CComplex
{       
public:
        double re,im;   
        CComplex(){re = 0; im = 0;}
        CComplex(double _re, double _im){re = _re; im = _im;}
 
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;
}
 
int main(){
    CComplex c;
    return 0;
}
Код
$ g++ -o wrong_complex wrong_complex.cpp 
wrong_complex.cpp:8: error: ‘Complex’ has not been declared
wrong_complex.cpp:8: error: ISO C++ forbids declaration of ‘Complex’ with no type
wrong_complex.cpp:19: error: expected `}' at end of input
wrong_complex.cpp: In member function ‘int CComplex::Complex(double)’:
wrong_complex.cpp:11: error: ‘class CComplex’ has no member named ‘mod’
wrong_complex.cpp:12: error: ‘class CComplex’ has no member named ‘arg’
wrong_complex.cpp:13: error: cannot convert ‘CComplex’ to ‘int’ in return
wrong_complex.cpp: At global scope:
wrong_complex.cpp:19: error: expected unqualified-id at end of input
чё это?!

Добавлено через 1 минуту

Не по теме:

Цитата Сообщение от Сыроежка Посмотреть сообщение
В вашем институте такие же безграмотные преподаватели, как на этом форуме модераторы
И мы о Вас черезвычайно высокого мнения... ;)

0
Заблокирован
03.09.2011, 21:21 15
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
- Во первых я окнчил ВУЗ с 5-м наивысшим уровнем аккредитации магистром с отличием, пусть и по другой специальности, не ВТ, во вторых дорости сначала до рейтинга сообщений, чтобы на равных говорить, в третьих, рекомендую прочесть п.4 правил форума, прежде чем гнать на модераторов и его участников, конешно если всё же хочешь на нём учавствоватьИ вобще кумарят выскочки которые возомнили, что центры вселенной и кроме ни никто не умеет программировать - проект привёл как наглядный пример - нет желания его изучать, тогда рекомендую изучить литературу по С!
Спасибо, я долго смеялся! Увы, то, что вы там заканчивали, никакого отношения не имеет к стандарту С++. Можно ничего не заканчивать, а читать стандарт С++, и вы будете грамотнее любого, кто имеет 10 образований, но не читал стандарт. Что касается пресловутого рейтинга, то тут такие же безграмотные, как вы, чаще всего модераторы в отместку мне, что я ловлю их на их безграмотности удаляют мне баллы! То есть есть такой тип непорядочных людей, которые вместо того, чтобы вступать в открытую дискуссию, потихонечку гадят.
Что касается меня, то я в себе уверен. Я на этом форуме один из самых грамотных специалистов по с++, и никаеи рейтинги меня смутить не в состоянии.
0
Заблокирован
Автор FAQ
03.09.2011, 21:26 16
Цитата Сообщение от easybudda Посмотреть сообщение
CComplex c;
- не так, вот так CComplex a(4.5;-6.4),

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

Добавлено через 3 минуты
Цитата Сообщение от Сыроежка Посмотреть сообщение
Я
- это последняя буква в алфавите, лучше коректно подбирать выссказывания, чтоб не было мучительно больно...
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12458 / 7482 / 1753
Регистрация: 25.07.2009
Сообщений: 13,762
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
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12458 / 7482 / 1753
Регистрация: 25.07.2009
Сообщений: 13,762
03.09.2011, 21:31 19
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
не так, вот так CComplex a(4.5;-6.4),
Да без разницы, компилятор до этой строчки не доходит даже. Напиши сам, чтобы компилировалось...
0
794 / 546 / 61
Регистрация: 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
03.09.2011, 21:38
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.09.2011, 21:38
Помогаю со студенческими работами здесь

Обобщения. Неявное преобразование типа невозможно
Вылетает ошибка: Неявное преобразование типа &quot;T &quot; в &quot;T&quot; невозможно. Почему так нельзя? ...

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

Быстрое преобразование Фурье и ошибка "Неявное преобразование типа"
А подскажите еще по одной прблемке: Есть программа реализующая БПФ (ну должна по крайней мере это...

Неявное преобразование типа int в bool. Как исправить?
using System; using System.Collections.Generic; using System.Linq; using System.Text; ...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru