Что я пытаюсь сделать, так это создать новый пользовательский тип данных, который ведет себя как все другие примитивные типы. В частности, этот тип данных выглядит как дробь с фиксированной точкой. Я создал класс для представления этого типа данных, называемый "класс 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 в объединении».
Что я думаю о решении, но не могу найти никаких доказательств в Интернете: определить перегруженный глобальный оператор приведения типов для приведения от «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
Любые идеи? Спасибо