Почему ваш код компилируется, но дает бессмысленные результаты, уже было объяснено adpalumbo .В вашем коде есть две фундаментальные проблемы, приводящие к этой ошибке, о которых я хочу рассказать здесь.
Во-первых, вы используете приведение в стиле C: (T)obj
.По сути, это просто говорит компилятору замолчать, вы знаете, что делаете.Это редко бывает хорошей идеей, потому что, когда вы знаете, что делаете, вы обычно можете обойтись без таких бросков.
Другое - то, что вы используете объекты, динамически выделяемые в куче.В C ++ объекты должны создаваться в стеке, если у вас нет веских причин для использования динамических объектов.А динамические объекты обычно скрыты внутри объектов в стеке.Таким образом, ваш код должен выглядеть следующим образом:
string lati(data.substr(0, data.find_first_of(",")));
double latDub = /* somehow create double from lati */;
this->latitude = latDub;
Конечно, latDub
совершенно не нужен, вы также можете написать прямо в this->latitude
.
Теперь обычным способом преобразования строки в какой-либо другой тип является ее потоковая передача через поток строк.После удаления ненужных переменных, которые вы ввели, ваш код будет выглядеть следующим образом:
std::istringstream iss(data.substr(0, data.find_first_of(",")));
if( !iss >> this->latitude ) throw "Dude, you need error handling here!";
Обычно вы хотите упаковать это преобразование из строки в служебную функцию, которую вы можете повторно использовать в коде:
inline double convert3double(const std::string& str)
{
std::istringstream iss(str);
double result;
if( !iss >> result )
throw std::exception("Dang!");
return result;
}
Однако, поскольку один и тот же алгоритм может использоваться для всех типов (для которых operator>>
значимо перегружен входным потоком в качестве левого операнда), просто сделайте этот шаблон:
template< typename T >
inline T convert3double(const std::string& str)
{
std::istringstream iss(str);
T result; // presumes default constructor
if( !iss >> result ) // presumes operator>>
throw std::exception("Dang!");
return result;
}