我有以下问题.
我正在开发一个C++模型和一个Qml视图,通过控制器连接它们.在我的模型中,我执行多次计算.我还为我的应用程序的用户提供了编写自定义事件处理程序的可能性,用qml编写.现在我遇到了一个问题,我决定使用固定点表示法,并编写了相应的C++类.现在我想向开发人员提供FixedPoint类 - 包括其所有运算符 - 他们决定在Qml中扩展我的应用程序.到目前为止,我提供了所有数据作为QProperties,这是编码指南所要求的.但我愿意接受其他解决方案,以便在我的团队中讨论它们.显然,固定点不是标识,算法依赖于复制它的可能性,这在继承QObject时是不允许的.
所以问题到了:我怎样才能将c ++类/结构体暴露给QML,这不是一个身份?
代码中的一个例子:
struct FixedPoint
{
FixedPoint(FixedPoint&);
FixedPoint& operator=(FixedPoint&);
...
int mantissa;
int exponent;
}
Run Code Online (Sandbox Code Playgroud)
我想在Qml中使用它作为用C++编写的QQuickItem的属性(值):
MyQmlObject{
value{ mantissa: 134; exponent: 3 }
}
Run Code Online (Sandbox Code Playgroud)
然后在javascript中的整个计算中使用属性值,并将其复制多次.所以我认为我不能将值设为FixedPoint*类型的属性.我对吗?
我们正在努力进行一次单位测试.在调查期间,我们找到了根本原因,这似乎是浮点数的比较(请参阅下面的代码片段,其中我简化了计算,但仍然失败).
TEST_F( MyFloatTest, thisOneDoesFail)
{
const float toCompare = 0.2f - 1.0f + 0.9f;
EXPECT_FLOAT_EQ( toCompare, 0.1f );
}
Run Code Online (Sandbox Code Playgroud)
结果是:
实际:0.1预期:比较哪个是:0.099999964
在数学数学方面有一些背景知识,我们仍然无法弄清楚为什么这个测试失败了,而使用std :: numerical_limits :: epsilon的自定义浮点数比较通过了.所以在某些时候我们开始思考,GTest是错的,我们调试了它.它使用奇怪的表达式,我们没有完全抓住.更奇怪的是:即使我只添加1,下面的测试也会通过:
TEST_F( MyFloatTest, thisOnePasses)
{
const float toCompare = 1.2f - 1.0f + 0.9f;
EXPECT_FLOAT_EQ( toCompare, 1.1f );
}
Run Code Online (Sandbox Code Playgroud)
我们认为在包含负浮点值时可能会出现问题,但下一个测试也会通过:
TEST_F( MyFloatTest, thisOnePassesAlso)
{
const float toCompare = 0.2f - 1.0f + 1.9f;
EXPECT_FLOAT_EQ( toCompare, 1.1f );
}
Run Code Online (Sandbox Code Playgroud)
所以对我们来说,看起来Gtest的EXPECT_FLOAT_EQ宏确实只是零问题.有谁知道这种行为?你有没有在你的环境中看到类似的东西?(顺便说一下:我们使用的是MSVC2015)由于GTest中提到的4 ULP精度,它是否偶然失败?(这对我们来说也不是很清楚).