Пишу универсальный тип данных(мини-версию)
Проблема возникла при вызове 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 которые выходят из области видимости делая указатель невалидным. Соответственно необходимо присваивать указателю адрес переменной, выделенной в куче или каком-нибудь внутреннем буфере.
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости