我正在学习C ++,所以这可能是一个基本问题,但是,这是一个现实生活中的问题。我需要以最优雅/现代的方式(> C ++ 98)将字符串从字符串转换为双精度,然后再转换为双精度*。
该结构由基于C的框架提供(我在这里简化了代码,因为这仅是问题的症结),并且由于它与封闭源Metatrader4交易应用程序(非基于C的接口)对接,因此我无法更改框架)。编程接口要求将指针传递给结构。
正在从包含我从Metatrader4应用程序获取的转储的csv文件中读取字符串。其细节超出了此问题。但是,输入仍然是字符串,因此是原始类型。
我很欣赏框架中使用的方法可能很老套,但这是生活的一部分。这并不意味着我不能渴望在代码中做得更好,因此我之所以要求优雅/现代的解决方案。如果它们不存在,那么我将被迫使用new,因为有人已经建议过。
我目前没有以下无效代码:
#include <string>
struct bidAsk
{
double *bid;
double *ask;
};
int main()
{
bidAsk ba;
ba.bid = std::stod("1.100");
ba.ask = &std::stod("1.102");
}
但是,上述两种转换方法均会因转换错误而失败。
第一行会导致错误,提示:
E0513 a value of type "double" cannot be assigned to an entity of type "double *"
第二行导致以下错误:
E0158 expression must be an lvalue or a function designator
我也尝试过static_cast,const_cast,make_unique和(double *)强制转换。
谢谢。
答案 0 :(得分:3)
问题是您需要一些实际值来指向指针指向。他们不能只是指向从您的数字转换函数返回的临时值。
struct bidAsk
{
double* bid;
double* ask;
};
int main()
{
bidAsk ba;
// these have to exist somewhere that lives as long as the
// bidAsk object that points to them.
double bid_value = std::stod("1.100");
double ask_value = std::stod("1.102");
ba.bid = &bid_value; // just pointing to the real values above
ba.ask = &ask_value;
}
答案 1 :(得分:1)
正如评论中其他人所述,某人必须拥有对象,指针指向。
extern C {
struct bidAsk
{
double *bid;
double *ask;
};
}
struct BidAskWrapper
{
BidAskWrapper(const std::string& sbid, const std::string& sask)
:bid{std::stod(sbid)}, ask{std::stor(sask)}
{}
//Note: bidAsk valid only till the lifetype of the wrapper
bidAsk make_c_struct() {
return {&bid, &ask};
}
double bid, ask;
};