Я пытаюсь обеспечить единый интерфейс для двух аналогичных типов, один из которых относится к double
s, а другой - к float
.выделение памяти для члена класса
class float_type {
float_type() { /* does floaty stuff */ }
float f();
};
class double_type {
double_type() { /* does doubly stuff */ }
double f();
};
Я хочу написать класс, который выделяет тот или иной в зависимости от того, что программа должна делать. Я отлично справляюсь с результатом преобразования float_type::f()
в двойное. На самом деле это так или иначе. Я попытался написать это:
class union_type {
bool is_double;
char mem[ sizeof(double_type) > sizeof(float_type)
? sizeof(double_type) : sizeof(float_type) ];
public:
float_or_double_value_reader(bool is_double)
: is_double(is_double)
{
if (is_double) new(mem) double_type();
else new(mem) float_type();
}
~float_or_double_value_reader() {
if (is_double) delete static_cast<double_type*>(mem);
else delete static_cast< float_type*>(mem);
}
double f() {
return (is_doubled
? static_cast<double_type*>(mem)->f()
: static_cast< float_type*>(mem)->f()
);
}
};
Но я получаю invalid static_cast from type 'char [128]' to type 'double_type'
.
Я знаю, что я мог бы добавить указатели членов, чтобы указать на то, что new
возвращается, , но это было бы излишним, так как я уже знаю, где mem
находится, , поэтому я хочу, чтобы избежать этого.
Вместо этого я использую reinterpret_cast
, я получаю free(): invalid pointer:
во время выполнения, когда union_type
уничтожен.
Какой способ литья здесь?
ли 'data' должен быть' mem'? Во всяком случае, когда вы используете новое место размещения, вы не используете 'delete' для объекта, потому что он попытается освободить память. Вместо этого явно вызовите соответствующий деструктор (например, 'reinterpret_cast (data) -> ~ double_type();') –
Да, 'data' является' mem'. Извинения за несогласованность. Позвольте мне исправить это. – SU3
@ChristopherOicles Спасибо. Я не знал об этом. Не могли бы вы написать это как ответ? – SU3