为什么你的代码编译,但给无意义的结果已经explained by 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;
}
来源
2011-09-18 20:33:15
sbi
为什么你这么用'new'?为什么使用'new'来分配所有东西的'std :: string'和**'double' **? –
@尼科尔:可能是因为他被所谓的“纯粹的”OO语言所毒化,所有这些都是“新鲜的”。 – sbi
Logan,在C++中是无意义的代码。你很少在C++中使用'new'数据,当你这样做时,它应该隐藏在一些非动态变量中。 – sbi