Пишу универсальный тип данных(мини-версию)
Проблема возникла при вызове getInside();
Вывод: Integer val: -858993460
Почему так? И как исправить?
class AnyType
{
private:
int *integer;
double *floating;
bool *boolean;
public:
AnyType()
{
integer = nullptr;
floating = nullptr;
boolean = nullptr;
}
template<typename T>
AnyType(T val)
{
if (typeid(floating) == typeid(T*))
{
floating = &val;
}
}
void ToInt()
{
int tmp=int(*floating);
integer = &tmp;
}
void getInside()
{
cout << "Integer val:" << *integer << endl;
}
};
int main()
{
AnyType fff(1.5);
fff.ToInt();
fff.getInside();
system("pause");
return 0;
}
Ошибка здесь:
void ToInt()
{
int tmp=int(*floating);
integer = &tmp;
}
Переменная tmp
локальная для метода ToInt
, поэтому она размещается на стеке. Указатель integer
указывает на адрес tmp
внутри стека. Когда выполнение ToInt
завершается, вы вызываете getInside
, а он, в свою очередь — методы cout::operator <<
для вывода строки и числа.
Эти методы размещают в стеке свои переменные, перезатирая значение tmp
, которое вы там разместили.
Для решения вашей задачи в C и C++ используют конструктор типа union
, объединение.
Альтернативное решение, которое подходят для объектно-ориентированного языка — абстрактный базовый класс Variable
и наследники типов IntVariable
, DoubleVariable
, и так далее.
Решение с указателями сложное для такой задачи.
В переменной floating
будет содержаться указатель на локальные переменные val
tmp
которые выходят из области видимости делая указатель невалидным. Соответственно необходимо присваивать указателю адрес переменной, выделенной в куче или каком-нибудь внутреннем буфере.
Виртуальный выделенный сервер (VDS) становится отличным выбором
Написал некий фрагмент кода (вообще пишу решение СЛАУ методом Гаусса), при данных значениях а и b, когда k >= 2 возникает ошибка -nan(ind) и nan (когда...
Задача написать функцию на С++,переводящую число X из 10 системы счисления в 3
Что такое "Thunk" в контексте виртуальных функций?(Как работает?)