我想知道如何编写返回具有常数成员数的数组的函数。它有意义吗? 我知道我可以这样做:
float* WojtekEQgraph::_Wk_N(float k)
{
float comp[2];
comp[0] = cos(-2.0f * double_Pi * (float)k); // Real number
comp[1] = sin(-2.0f * double_Pi * (float)k); // Imag number
return comp;
}
它返回有两个成员的数组。但实际上"返回"推荐指向数组的指针,无论它有多少成员。 但如果以某种不可预测的方式存在
float comp[3]
或float comp[1]
我希望return comp;
会给我错误。
我怎么能这样做?
我试过了:
float[2] WojtekEQgraph::_Wk_N(float k)
{
float comp[2];
comp[0] = cos(-2.0f * double_Pi * (float)k); // Real number
comp[1] = sin(-2.0f * double_Pi * (float)k); // Imag number
return comp;
}
但它不起作用。提前感谢任何帮助。
答案 0 :(得分:2)
如果要返回数组对象,则C ++标准库将其拼写为std::array
。所以将它应用到你的例子中:
std::array<float, 2> WojtekEQgraph::_Wk_N(float k)
{
std::array<float, 2> comp;
comp[0] = cos(-2.0f * double_Pi * (float)k); // Real number
comp[1] = sin(-2.0f * double_Pi * (float)k); // Imag number
return comp;
}
会这样做。其他优点包括缺少悬空引用和处理凌乱的内存分配的需要。短而甜的聚合。
如果你正在处理复杂的数字,还有另一个答案。不要重新发明轮子,而是使用std::complex
。
答案 1 :(得分:2)
虽然@ StoryTeller的answer对于你提出字面的内容是正确的,但也可以说你真正想要返回的不是“2个浮点阵列” - 你想要返回一个复数。
现在,与@ StefanLechner的suggestion不同,我建议您使用标准库的类来表示复数,使用浮点数指定以适合您当前的精度选择:
std::complex<float> WojtekEQgraph::_Wk_N(float k)
{
return {
cos(-2.0f * double_Pi * (float)k), // Real number
sin(-2.0f * double_Pi * (float)k), // Imag number
};
}
在您更具体的情况下,只需:
std::complex<float> WojtekEQgraph::_Wk_N(float k)
{
return std::polar<float>( 1.0f, -2.0f * double_Pi * k );
}
答案 2 :(得分:1)
您的代码返回一个指向局部变量的指针,这很可能会产生未定义的行为:
float comp[2];
...
return comp;
您问题的直接答案是使用std::array<float, 2>
数据类型。
然而,好像你想要&#34;滥用&#34;用于表示复数的数组。我建议引入一个类并返回该类的对象:
struct ComplexNumber{
float real;
float imaginary;
}
ComplexNumber WojtekEQgraph::_Wk_N(float k) {
ComplexNumber c;
c.real = ...
c.imaginary = ...
return c;
}
答案 3 :(得分:0)
如果您使用的是c ++ 11,则一个解决方案是使用std :: array
std::array< float, 2 > WojtekEQgraph::_Wk_N(float k)
{
std::array< float, 2 > comp;
comp[0] = cos(-2.0f * double_Pi * (float)k); // Real number
comp[1] = sin(-2.0f * double_Pi * (float)k); // Imag number
return comp;
}
另一种方法是将数组传递给方法:
void WojtekEQgraph::_Wk_N(float k, float comp[2])
{
comp[0] = cos(-2.0f * double_Pi * (float)k); // Real number
comp[1] = sin(-2.0f * double_Pi * (float)k); // Imag number
}
float comp[2];
obj._Wk_N(0, comp);