分配:
从文本文件中读取信息(完成)
使用substr方法(完成)
将信息存储到实例变量中(需要帮助)
以下是我遇到问题的代码:
string* lati;
lati = new string(data.substr(0, data.find_first_of(",")));
double* latDub;
latDub = new double(atof((char *)lati));
this->latitude = *latDub;
我需要将纬度存储到实例变量latitude
中。
变量data
是读入文本文件。
this->latitude
被声明为double
。
我已经过测试,变量lati
是正确的值,但是一旦我尝试将其转换为double
,由于某种原因,值会更改为0
。我特意应该在转换时使用atof
方法!
答案 0 :(得分:2)
(char *)lati
没有按照您的想法行事。你明显要做的是获得与lati相关联的char
序列,但你实际做的只是将string*
压缩到char*
这是各种各样的坏。
std :: string上有一个成员函数,可以为您提供所需的内容。您应查看字符串的文档,并将(char *)lati
替换为该函数的调用。
答案 1 :(得分:0)
为什么你的代码会编译,但是已经提供了无意义的结果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;
}