Почему такой результат?

128
28 сентября 2019, 18:10

Пишу универсальный тип данных(мини-версию) Проблема возникла при вызове 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;
}
Answer 1

Ошибка здесь:

void ToInt()
{
    int tmp=int(*floating);
    integer = &tmp;
}

Переменная tmp локальная для метода ToInt, поэтому она размещается на стеке. Указатель integer указывает на адрес tmp внутри стека. Когда выполнение ToInt завершается, вы вызываете getInside, а он, в свою очередь — методы cout::operator << для вывода строки и числа.

Эти методы размещают в стеке свои переменные, перезатирая значение tmp, которое вы там разместили.

Для решения вашей задачи в C и C++ используют конструктор типа union, объединение.

Альтернативное решение, которое подходят для объектно-ориентированного языка — абстрактный базовый класс Variable и наследники типов IntVariable, DoubleVariable, и так далее.

Решение с указателями сложное для такой задачи.

Answer 2

В переменной floating будет содержаться указатель на локальные переменные val tmp которые выходят из области видимости делая указатель невалидным. Соответственно необходимо присваивать указателю адрес переменной, выделенной в куче или каком-нибудь внутреннем буфере.

READ ALSO
-nan(ind) и nan

-nan(ind) и nan

Написал некий фрагмент кода (вообще пишу решение СЛАУ методом Гаусса), при данных значениях а и b, когда k >= 2 возникает ошибка -nan(ind) и nan (когда...

132
C++ захват переменной из лямбда функции

C++ захват переменной из лямбда функции

есть такая функция, которая принимает другую функцию:

124
динамический массив с++ [закрыт]

динамический массив с++ [закрыт]

Задача написать функцию на С++,переводящую число X из 10 системы счисления в 3

134
&ldquo;Thunk&rdquo; в контексте виртуальных функций

“Thunk” в контексте виртуальных функций

Что такое "Thunk" в контексте виртуальных функций?(Как работает?)

102