Я пытаюсь создать новый пользовательский тип данных, который ведет себя как все остальные примитивные типы. В частности, этот тип данных появляется как фракция с фиксированной точкой. Я создал класс, представляющий этот тип данных, называемый «класс FixedPoint», и в нем есть способы приведения типов от «FixedPoint» к «int» или «double» или «unsigned int» и т. Д. Это прекрасно ,C++: Пользовательский тип данных - проблемы с типом и объединением
Теперь, что, если я хочу бросить от "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 в союзе».
Что я думаю, что решение есть, но не может найти никаких доказательств в Интернете: Определите перегруженный глобальный оператор типа-типа для перевода из «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
Любые идеи? Thanks
Да. На данный момент мы превратили все «союзы» в «структуры» как хак (для любой цели, использующей фиксированную точку). – Ootawata
@Ootawata: Если вы удовлетворены ответом, вы должны его принять. – messenger
Чтобы действительно обернуть это, я сделал кучу глобальных функций, которые использовали разные типы (int, double, float, short и т. Д.), Где каждый возвращал тип FixedPoint. Невозможно применить тип к фиксированной точке - вы должны вызвать одну из глобальных функций. Это позволило мне сохранить класс как обычный стиль данных для использования в союзах. – Ootawata