#c #c 11 #move-semantics #virtual-functions #stdmove
Вопрос:
У меня есть универсальный класс, который может хранить значение и тип значения, закодированного в виде строки.
#include <iostream>
#include <string>
#include <memory>
#include <cassert>
struct IValueHolder
{
virtual ~IValueHolder() = defau<
virtual const std::stringamp; getType() = 0;
virtual void setType(const std::stringamp; t_type) = 0;
};
template<class T>
class ValueHolder : public IValueHolder
{
private:
T m_value;
std::string m_type;
public:
ValueHolder(T t_value) : m_value(t_value){}
virtual const std::stringamp; getType() override
{
return m_type;
}
virtual void setType(const std::stringamp; t_type) override
{
m_type= t_type;
}
const Tamp; getValue() const
{
return m_value;
}
};
std::unique_ptr<IValueHolder> build_int_property()
{
auto p32{ std::make_unique<ValueHolder<int32_t>>(0) };
p32->setType("int32");
return std::move(p32);
}
int main()
{
auto v32 = dynamic_cast<ValueHolder<int32_t>*>(build_int_property().get());
assert(v32->getValue() == 0); // FAILS
assert(v32->getType() == "int32"); // FAILS
return EXIT_SUCCESS;
}
И у меня есть еще одна полезная функция build_int_property, которая создает целочисленное свойство. Но, к сожалению, тесты проваливаются. Кто-нибудь может объяснить, что здесь происходит не так?
Комментарии:
1. Указатель, который вы формируете (v32), указывает на временное выражение, которое выходит за рамки следующих строк.
2. Старая проблема с болтающимся указателем . Просто сделайте
auto p32 = build_int_property();
так, чтобы умный указатель оставался рядом до конца области видимости, а затемauto v32 = dynamic_cast<ValueHolder<int32_t>*>(p32.get());