Я пытаюсь создать новый пользовательский тип данных, который будет вести себя как все другие примитивные типы.В частности, этот тип данных выглядит как дробь с фиксированной точкой.Я создал класс для представления этого типа данных, который называется «класс FixedPoint», и в нем есть способы трансляции типов из «FixedPoint» в «int», «double» или «unsigned int» и т. Д. Это нормально.
А что если я хочу разыграть с "int" to "FixedPoint"
?Первоначально мое решение состояло в том, чтобы иметь конструктор:
FixedPoint(int i) { /* some conversion from 'int' to 'FixedPoint' in here */ }
Это работает ... но вы не можете поместить его в объединение следующим образом:
union {
FixedPoint p;
};
Это сломается, потому что "FixedPoint«не имеет неявного тривиального конструктора (мы только что определили конструктор« FixedPoint (int i) »).
Подводя итог, можно сказать, что вся проблема в том, что« мы хотим cast from some type T to type FixedPoint without explicitly defining a constructor
, чтобы мы могли использовать наш типFixedPoint in the union ".
Я думаю, что решение, но не может найти никаких доказательств в Интернете: определить перегруженный глобальный оператор Typecast для преобразования из" int "в" FixedPoint ".
Есть ли способ сделать это без использования конструкторов классов?Я хотел бы иметь возможность использовать этот класс в союзе.Что я пробовал (в глобальном масштабе):
operator (FixedPoint f, int a) { ... } //compiler complains about this is not a method or non-static.
И небольшой пример того, как профсоюзы не любят конструкторов (им нравится POD)
class bob
{
public:
bob(int a) { m_num = a; }
private:
int m_num;
};
void duck()
{
union
{
bob a;
};
}
Эта ошибка замечена вVisual Studio это:
error C2620: member 'duck::<unnamed-tag>::a' of union 'duck::<unnamed-tag>' has user-defined constructor or non-trivial default constructor
Есть идеи?Спасибо