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

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

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

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

03.09.2011, 20:35. Просмотров 2953. Ответов 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
dihlofos
Бродяга
303 / 257 / 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 );
1
Chelioss
180 / 180 / 4
Регистрация: 08.01.2011
Сообщений: 1,133
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
Chelioss
180 / 180 / 4
Регистрация: 08.01.2011
Сообщений: 1,133
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
Chelioss
180 / 180 / 4
Регистрация: 08.01.2011
Сообщений: 1,133
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
Цитата Сообщение от Сыроежка Посмотреть сообщение
Я вам второй раз повторяю, что конструкторы не возвращают значения!
- Вот готовый проект, который был защищён в институте, настоятельно рекомендую всё изучить!!!

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

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

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

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

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

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


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

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

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