Форум программистов, компьютерный форум 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)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
dihlofos
Бродяга
 Аватар для dihlofos
302 / 256 / 17
Регистрация: 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 );
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,131
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 );
Это единственный вариант? Можно как-нибудь по другому исправить мою ошибку?
-=ЮрА=-
Заблокирован
Автор 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.
Сыроежка
Заблокирован
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 );
Это единственный вариант? Можно как-нибудь по другому исправить мою ошибку?
У вас все равно сохранится неоднозначность. Вам просто нужно убрать из списка конструкторов первый конструктор.
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,131
03.09.2011, 20:59  [ТС]     Не работает явное преобразование типа, а неявное работает. #6
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
В твоём посте о комплексных числах уже привёл целый готовый и работоспособный класс
Я сам хочу написать, ибо опыт то получать надо. Да и ваш не подходит потому, что в моем тупом задании комплексный класс совсем по другому себя ведет.

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

Добавлено через 2 минуты
Цитата Сообщение от Сыроежка Посмотреть сообщение
У вас все равно сохранится неоднозначность. Вам просто нужно убрать из списка конструкторов первый конструктор.
Нет, только что проверил. Да и вы сам где видите неоднозначность? Выбирается тот конструктор у которого 1 параметр.
-=ЮрА=-
Заблокирован
Автор 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;
}
Сыроежка
Заблокирован
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.
Сыроежка
Заблокирован
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;
}
Я вам второй раз повторяю, что конструкторы не возвращают значения!
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,131
03.09.2011, 21:07  [ТС]     Не работает явное преобразование типа, а неявное работает. #10
Все, я понял. Я плохо запомнил из книги, что делает explicit.
Оказывается он подавляет только неявные преобразования, т.е.
код Complex complex = 999 работает, т.к. тут неявное преобразования, а из-за того, что есть explicit, один из конструкторов запрещается и остается только оставшийся.
А тут Complex complex = Complex(999) не работает, т.к. explicit не подавляет явное преобразование.

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

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

- конструктор возвращают объект первоначально инициализированный, этот объект можно переинициализировать...
Меня не интересует ваш проект, защищенный в институте. В вашем институте такие же безграмотные преподаватели, как на этом форуме модераторы. Читайте не доморощенные проекты, а читайте стандарт языка С++!
-=ЮрА=-
Заблокирован
Автор FAQ
03.09.2011, 21:18     Не работает явное преобразование типа, а неявное работает. #13
Цитата Сообщение от Сыроежка Посмотреть сообщение
В вашем институте такие же безграмотные преподаватели, как на этом форуме модераторы.
- Во первых я окнчил ВУЗ с 5-м наивысшим уровнем аккредитации магистром с отличием, пусть и по другой специальности, не ВТ, во вторых дорости сначала до рейтинга сообщений, чтобы на равных говорить, в третьих, рекомендую прочесть п.4 правил форума, прежде чем гнать на модераторов и его участников, конешно если всё же хочешь на нём учавствоватьИ вобще кумарят выскочки которые возомнили, что центры вселенной и кроме ни никто не умеет программировать - проект привёл как наглядный пример - нет желания его изучать, тогда рекомендую изучить литературу по С!
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
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 минуту

Не по теме:

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

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

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

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

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

Добавлено через 3 минуты
- это последняя буква в алфавите, лучше коректно подбирать выссказывания, чтоб не было мучительно больно...
Мучительно больн7о должно быть вам за вашу безграмотность и ваше чванство с вашим образованием. Можете жаловаться модераторам. Это будет в духе ваших человеческих качеств! Безграмотность - она всегда агрессивна!
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
03.09.2011, 21:31     Не работает явное преобразование типа, а неявное работает. #19
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
не так, вот так CComplex a(4.5;-6.4),
Да без разницы, компилятор до этой строчки не доходит даже. Напиши сам, чтобы компилировалось...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.09.2011, 21:38     Не работает явное преобразование типа, а неявное работает.
Еще ссылки по теме:

C++ Явное преобразование типов
static_cast и явное преобразование типов C++
Конструктор и декструктор, явное и неявное объявление C++

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

Или воспользуйтесь поиском по форуму:
talis
 Аватар для talis
789 / 541 / 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; /* <<< ВОТ ЭТО ЕСТЬ ВОЗВРАЩЕНИЕ ИЗ КОНСТРУКТОРА */
}
Yandex
Объявления
03.09.2011, 21:38     Не работает явное преобразование типа, а неявное работает.
Ответ Создать тему
Опции темы

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