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

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

Восстановить пароль Регистрация
 
Armando111
 Аватар для Armando111
0 / 0 / 0
Регистрация: 07.02.2014
Сообщений: 221
10.07.2014, 11:42     Как сконвертировать свой тип в тип double? #1
Можно ли конвертировать свой тип в тип doble? Если да, то каким способом?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
10.07.2014, 11:46     Как сконвертировать свой тип в тип double? #2
Перегрузить оператор преобразования типов

http://www.learncpp.com/cpp-tutorial...ing-typecasts/
Armando111
 Аватар для Armando111
0 / 0 / 0
Регистрация: 07.02.2014
Сообщений: 221
10.07.2014, 12:05  [ТС]     Как сконвертировать свой тип в тип double? #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
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
10.07.2014, 12:44     Как сконвертировать свой тип в тип double? #4
Цитата Сообщение от Armando111 Посмотреть сообщение
Можно ли конвертировать свой тип в тип doble? Если да, то каким способом?
Наитупейший способ:
C++
1
2
3
4
struct C
{
   operator double() { return 100500.42; }
};
Использование:
C++
1
2
C c;
double d = c; // здесь вызывается преобразование
Armando111
 Аватар для Armando111
0 / 0 / 0
Регистрация: 07.02.2014
Сообщений: 221
10.07.2014, 12:57  [ТС]     Как сконвертировать свой тип в тип double? #5
Цитата Сообщение от Tulosba Посмотреть сообщение
C++
1
2
3
4
struct C
{
  operator double() { return 100500.42; }
};
и куда это ставить?
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
10.07.2014, 13:36     Как сконвертировать свой тип в тип double? #6
Цитата Сообщение от Armando111 Посмотреть сообщение
и куда это ставить?
В свой класс.
Armando111
 Аватар для Armando111
0 / 0 / 0
Регистрация: 07.02.2014
Сообщений: 221
10.07.2014, 13:43  [ТС]     Как сконвертировать свой тип в тип double? #7
Простите, но я не пойму в какой файл, и куда именно...
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
10.07.2014, 13:47     Как сконвертировать свой тип в тип double? #8
Armando111, заголовочный файл, реализация. Есть это всё? Если есть - покажите.
Armando111
 Аватар для Armando111
0 / 0 / 0
Регистрация: 07.02.2014
Сообщений: 221
10.07.2014, 13:48  [ТС]     Как сконвертировать свой тип в тип double? #9
Выше я всё выложил
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
10.07.2014, 13:55     Как сконвертировать свой тип в тип double? #10
Цитата Сообщение от Armando111 Посмотреть сообщение
Выше я всё выложил
Для этого случая вообще не нужно преобразование делать, т.к. есть метод timeElapsed() например.
Но если уж очень хочется получить, то например так:
C++
1
2
3
4
5
6
class TimeCounter
{
public:
   operator double() const { return timeElapsed(); } // добавить эту строку
//...
};
Armando111
 Аватар для Armando111
0 / 0 / 0
Регистрация: 07.02.2014
Сообщений: 221
10.07.2014, 14:08  [ТС]     Как сконвертировать свой тип в тип double? #11
Спасибо, а как можно в String конвертировать?
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
10.07.2014, 14:11     Как сконвертировать свой тип в тип double? #12
Armando111, в общем случае оператор преобразования в тип T будет выглядеть так:
C++
1
operator T() const { /* do smth */ }
Подставляйте вместо T что хотите: хоть стринги, хоть шорты ...
Armando111
 Аватар для Armando111
0 / 0 / 0
Регистрация: 07.02.2014
Сообщений: 221
10.07.2014, 14:23  [ТС]     Как сконвертировать свой тип в тип double? #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(); }
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
10.07.2014, 14:44     Как сконвертировать свой тип в тип double? #14
Цитата Сообщение от Armando111 Посмотреть сообщение
Хм, не получается....
Читать сообщения об ошибках не получается? Русским же языком написано.
Вы лучше почитайте сначала книжек по языку, вот тут можете список литературы посмотреть.
А потом уже задавайте более конкретные вопросы, когда возникнут проблемы. Т.к. сейчас Вы просто тыкаетесь наугад, не понимая сути дела.

Добавлено через 2 минуты
C++
1
operator std::string() const { return std::to_string(timeElapsed()); }
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.07.2014, 15:03     Как сконвертировать свой тип в тип double?
Еще ссылки по теме:

Как реализовать свой тип данных C++
Не могу преобразовать тип char в тип double C++
C++ Как создать свой целочисленный тип данных с пределом от 0 до 500

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

Или воспользуйтесь поиском по форуму:
Armando111
 Аватар для Armando111
0 / 0 / 0
Регистрация: 07.02.2014
Сообщений: 221
10.07.2014, 15:03  [ТС]     Как сконвертировать свой тип в тип double? #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 ==========
Yandex
Объявления
10.07.2014, 15:03     Как сконвертировать свой тип в тип double?
Ответ Создать тему
Опции темы

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