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

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

Войти
Регистрация
Восстановить пароль
 
Armando111
0 / 0 / 0
Регистрация: 07.02.2014
Сообщений: 228
#1

Как сконвертировать свой тип в тип double? - C++

10.07.2014, 11:42. Просмотров 551. Ответов 14
Метки нет (Все метки)

Можно ли конвертировать свой тип в тип doble? Если да, то каким способом?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.07.2014, 11:42
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как сконвертировать свой тип в тип double? (C++):

Ошибки error C2296: -: недопустимо, левый операнд имеет тип "double (__cdecl *)(double,double,double - C++
Думаю из-за polp #include<iostream> #include<cmath> #include<cstdlib> using namespace std; double polp(double af,double...

Не могу преобразовать тип char в тип double - C++
Вся загвоздка в str1 и str2; #include "stdafx.h" #include "conio.h" #include"stdlib.h" #include "cstdlib" #include <iostream> ...

Как преобразовать тип double в string - C++
Есть переменная типа double нужно ее преобразовать в тип string Как это можно сделать наиболее простым способом используя стандартные...

Как создать свой собственный тип на C++? - C++
Здравствуйте!!! Возник вопрос как создать свой собственный тип на С++ который включат такие типы как int, string, double?

Свой тип как параметр шаблона - C++
Есть вопрос по коду: #include <iostream> #include <memory> #include <vector> using namespace std; template<class T> class...

Как реализовать свой тип данных - C++
Здравсвтуйте,подскажите пожалуйста как реализовать с с++ свой тип данных. Допустим хочу завести массив,где каждому arr будет соответсвовать...

14
soon
2542 / 1307 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
10.07.2014, 11:46 #2
Перегрузить оператор преобразования типов

http://www.learncpp.com/cpp-tutorial/910-overloading-typecasts/
0
Armando111
0 / 0 / 0
Регистрация: 07.02.2014
Сообщений: 228
10.07.2014, 12:05  [ТС] #3
А на русском есть?

Добавлено через 14 минут
Вот класс, взял я его в интернете, помогите.
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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
//#include <stdafx.h>
#include <TimeCounter.h>
#include <windows.h>
 
void TimeCounter::Start()
{
//   assert(!started);
   started=true;
   stopped=false;
   new_priority=0;
 
   LARGE_INTEGER pf;
    QueryPerformanceFrequency(&pf);
   i64PerfFrequency = pf.QuadPart;
    Sleep(0);
    QueryPerformanceCounter(&pf);
   tBefore = pf.QuadPart;
}
 
void TimeCounter::Start(int nPriority)
{
//   assert(!started);
   started=true;
   stopped=false;
   new_priority=nPriority;
   old_priority=GetThreadPriority(GetCurrentThread());
   SetThreadPriority(GetCurrentThread(),new_priority);
 
   LARGE_INTEGER pf;
    QueryPerformanceFrequency(&pf);
   i64PerfFrequency = pf.QuadPart;
    Sleep(0); 
   QueryPerformanceCounter(&pf);
   tBefore = pf.QuadPart;
}
 
void TimeCounter::Stop()
{
//   assert(started);
   LARGE_INTEGER tAfter1;
   QueryPerformanceCounter(&tAfter1);
   tAfter = tAfter1.QuadPart;
 
   tWord = tAfter - tBefore;
   tWord /= i64PerfFrequency;
   if (new_priority)
      SetThreadPriority(GetCurrentThread(),old_priority);
   started=false;
   stopped=true;
}
   
double TimeCounter::timeElapsed() const
{
   LARGE_INTEGER tempAfter;
   double tempWord;
 
   if (started)
   {
      QueryPerformanceCounter(&tempAfter);
      tempWord = tempAfter.QuadPart - tBefore;
      tempWord /= i64PerfFrequency;
 
      return tempWord;
   }
   if (stopped)
      return tWord;
   
   return 0.;
}
 
TimeCounter::~TimeCounter()
{
   if (new_priority)
      SetThreadPriority(GetCurrentThread(),old_priority);
}
 
std::ostream& operator<<(std::ostream& out, TimeCounter& cntr)
{
   double fsec = cntr.timeElapsed();
   int hour = int(fsec/3600.);
   double fmin = fsec-3600.*double(hour);
   int min = int(fmin/60.);
   double sec = fmin-60.*double(min);
   //out<<hour<<min<<sec<<std::endl;
   out<<sec<<std::endl;
//   out<<"Calculated with priority number: ";
//   if (cntr.getNewPriority())
//      out<<cntr.getNewPriority()<<endl;
//   else
//      out<<GetThreadPriority(GetCurrentThread())<<endl;
   return out;
}
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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
// TimeCounter.h
 
#ifndef __TIMECOUNTER222__H__
#define __TIMECOUNTER222__H__
 
#include <iostream>
 
// #include <cassert>
 
//////////////////////////////////////////
/// Допустимые значения приоритета потока:
/// THREAD_PRIORITY_HIGHEST
/// THREAD_PRIORITY_ABOVE_NORMAL
/// THREAD_PRIORITY_NORMAL
/// THREAD_PRIORITY_BELOW_NORMAL
/// THREAD_PRIORITY_LOWEST
//////////////////////////////////////////
 
class TimeCounter
{
friend std::ostream& operator<<(std::ostream& out, TimeCounter& cntr);
public:
 
   TimeCounter() {started=false; stopped=false;}
   void Start();
   void Start(int nPriority);
   void Stop();
   double timeElapsed() const;
   bool getStarted() const {return started;}
   bool getStopped() const {return stopped;} 
   int getNewPriority() const {return new_priority;} 
   ~TimeCounter();
 
protected:
 
   int new_priority;
   int old_priority;
   bool started;
   bool stopped;
   double tBefore, tAfter, i64PerfFrequency;
    double tWord;
 
};
 
#endif
0
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
10.07.2014, 12:44 #4
Цитата Сообщение от Armando111 Посмотреть сообщение
Можно ли конвертировать свой тип в тип doble? Если да, то каким способом?
Наитупейший способ:
C++
1
2
3
4
struct C
{
   operator double() { return 100500.42; }
};
Использование:
C++
1
2
C c;
double d = c; // здесь вызывается преобразование
0
Armando111
0 / 0 / 0
Регистрация: 07.02.2014
Сообщений: 228
10.07.2014, 12:57  [ТС] #5
Цитата Сообщение от Tulosba Посмотреть сообщение
C++
1
2
3
4
struct C
{
  operator double() { return 100500.42; }
};
и куда это ставить?
0
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
10.07.2014, 13:36 #6
Цитата Сообщение от Armando111 Посмотреть сообщение
и куда это ставить?
В свой класс.
0
Armando111
0 / 0 / 0
Регистрация: 07.02.2014
Сообщений: 228
10.07.2014, 13:43  [ТС] #7
Простите, но я не пойму в какой файл, и куда именно...
0
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
10.07.2014, 13:47 #8
Armando111, заголовочный файл, реализация. Есть это всё? Если есть - покажите.
0
Armando111
0 / 0 / 0
Регистрация: 07.02.2014
Сообщений: 228
10.07.2014, 13:48  [ТС] #9
Выше я всё выложил
0
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
10.07.2014, 13:55 #10
Цитата Сообщение от Armando111 Посмотреть сообщение
Выше я всё выложил
Для этого случая вообще не нужно преобразование делать, т.к. есть метод timeElapsed() например.
Но если уж очень хочется получить, то например так:
C++
1
2
3
4
5
6
class TimeCounter
{
public:
   operator double() const { return timeElapsed(); } // добавить эту строку
//...
};
1
Armando111
0 / 0 / 0
Регистрация: 07.02.2014
Сообщений: 228
10.07.2014, 14:08  [ТС] #11
Спасибо, а как можно в String конвертировать?
0
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
10.07.2014, 14:11 #12
Armando111, в общем случае оператор преобразования в тип T будет выглядеть так:
C++
1
operator T() const { /* do smth */ }
Подставляйте вместо T что хотите: хоть стринги, хоть шорты ...
0
Armando111
0 / 0 / 0
Регистрация: 07.02.2014
Сообщений: 228
10.07.2014, 14:23  [ТС] #13
Хм, не получается....

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
25
26
27
28
29
30
31
32
33
34
35
36
37
D:\basic_set_png\New Folder (3)\race\game\TimeCounter.h(26): error C2664: std::basic_string<_Elem,_Traits,_Ax>::basic_string(const std::basic_string<_Elem,_Traits,_Ax> &): невозможно преобразовать параметр 1 из "double" в "const std::basic_string<_Elem,_Traits,_Ax> &"
1>          with
1>          [
1>              _Elem=char,
1>              _Traits=std::char_traits<char>,
1>              _Ax=std::allocator<char>
1>          ]
1>          Причина: невозможно преобразовать "double" в "const std::basic_string<_Elem,_Traits,_Ax>"
1>          with
1>          [
1>              _Elem=char,
1>              _Traits=std::char_traits<char>,
1>              _Ax=std::allocator<char>
1>          ]
1>          Ни один конструктор не смог принять исходный тип, либо разрешение перегрузки конструктора неоднозначно
1>  TimeCounter.cpp
1>D:\basic_set_png\New Folder (3)\race\game\TimeCounter.h(26): error C2664: std::basic_string<_Elem,_Traits,_Ax>::basic_string(const std::basic_string<_Elem,_Traits,_Ax> &): невозможно преобразовать параметр 1 из "double" в "const std::basic_string<_Elem,_Traits,_Ax> &"
1>          with
1>          [
1>              _Elem=char,
1>              _Traits=std::char_traits<char>,
1>              _Ax=std::allocator<char>
1>          ]
1>          Причина: невозможно преобразовать "double" в "const std::basic_string<_Elem,_Traits,_Ax>"
1>          with
1>          [
1>              _Elem=char,
1>              _Traits=std::char_traits<char>,
1>              _Ax=std::allocator<char>
1>          ]
1>          Ни один конструктор не смог принять исходный тип, либо разрешение перегрузки конструктора неоднозначно
1>TimeCounter.cpp(14): warning C4244: =: преобразование "LONGLONG" в "double", возможна потеря данных
1>TimeCounter.cpp(17): warning C4244: =: преобразование "LONGLONG" в "double", возможна потеря данных
1>TimeCounter.cpp(31): warning C4244: =: преобразование "LONGLONG" в "double", возможна потеря данных
1>TimeCounter.cpp(34): warning C4244: =: преобразование "LONGLONG" в "double", возможна потеря данных
1>TimeCounter.cpp(42): warning C4244: =: преобразование "LONGLONG" в "double", возможна потеря данных
========== Построение: успешно: 0, с ошибками: 1, без изменений: 0, пропущено: 0 ==========
Добавлено через 1 минуту
C++
1
operator string() { return timeElapsed(); }
0
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
10.07.2014, 14:44 #14
Цитата Сообщение от Armando111 Посмотреть сообщение
Хм, не получается....
Читать сообщения об ошибках не получается? Русским же языком написано.
Вы лучше почитайте сначала книжек по языку, вот тут можете список литературы посмотреть.
А потом уже задавайте более конкретные вопросы, когда возникнут проблемы. Т.к. сейчас Вы просто тыкаетесь наугад, не понимая сути дела.

Добавлено через 2 минуты
C++
1
operator std::string() const { return std::to_string(timeElapsed()); }
0
Armando111
0 / 0 / 0
Регистрация: 07.02.2014
Сообщений: 228
10.07.2014, 15:03  [ТС] #15
Когда я поменял строку на эту, то опять появились ошибки...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
d:\basic_set_png\new folder (3)\race\game\timecounter.h(26): error C2668: std::to_string: неоднозначный вызов перегруженной функции
1>          d:\программы\vs2010c++\vc\include\string(688): может быть "std::string std::to_string(long double)"
1>          d:\программы\vs2010c++\vc\include\string(680): или       "std::string std::to_string(_ULonglong)"
1>          d:\программы\vs2010c++\vc\include\string(672): или       "std::string std::to_string(_Longlong)"
1>          при попытке сопоставить список аргументов "(double)"
1>  TimeCounter.cpp
1>d:\basic_set_png\new folder (3)\race\game\timecounter.h(26): error C2668: std::to_string: неоднозначный вызов перегруженной функции
1>          d:\программы\vs2010c++\vc\include\string(688): может быть "std::string std::to_string(long double)"
1>          d:\программы\vs2010c++\vc\include\string(680): или       "std::string std::to_string(_ULonglong)"
1>          d:\программы\vs2010c++\vc\include\string(672): или       "std::string std::to_string(_Longlong)"
1>          при попытке сопоставить список аргументов "(double)"
1>d:\basic_set_png\new folder (3)\race\game\timecounter.cpp(14): warning C4244: =: преобразование "LONGLONG" в "double", возможна потеря данных
1>d:\basic_set_png\new folder (3)\race\game\timecounter.cpp(17): warning C4244: =: преобразование "LONGLONG" в "double", возможна потеря данных
1>d:\basic_set_png\new folder (3)\race\game\timecounter.cpp(31): warning C4244: =: преобразование "LONGLONG" в "double", возможна потеря данных
1>d:\basic_set_png\new folder (3)\race\game\timecounter.cpp(34): warning C4244: =: преобразование "LONGLONG" в "double", возможна потеря данных
1>d:\basic_set_png\new folder (3)\race\game\timecounter.cpp(42): warning C4244: =: преобразование "LONGLONG" в "double", возможна потеря данных
1>  Создание кода...
========== Построение: успешно: 0, с ошибками: 1, без изменений: 0, пропущено: 0 ==========
0
10.07.2014, 15:03
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.07.2014, 15:03
Привет! Вот еще темы с ответами:

Как написать функцию c типом long double возвращаюшую тип shot? - C++
Мне бы какой нибудь тривиальный пример в Си. Спасибо:)

Как создать свой целочисленный тип данных с пределом от 0 до 500 - C++
Доброе утро. Кто может подсказать, как создать персональный тип данных. Задумка вот в чем. Нужна программа, где по нажатию на &quot;A&quot;...

Как правильно число в ячейке типа string, перекинуть в ячейку в тип double ? - C++
Cуть вопроса описанна в теме. Может не правильно объяснил, но всё же, вот пример: #include &lt;iostream&gt; #include &lt;string&gt; ...

Enum и типы данных. Как задать тип значений явно, и какой тип будет при переполнении? - C++
Пытаюсь сделать функцию с передачей нескольких параметров,используя битовые операции. В качестве параметров думаю использовать не...


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

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

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