返回具有const成员数的数组

问题描述 投票:0回答:4

我想知道如何编写返回具有常数成员数的数组的函数。它有意义吗?我知道我可以这样做:

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;
}

但它不起作用。如有任何帮助,请提前感谢。

c++ arrays complex-numbers multiple-return-values
4个回答
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


2
投票

Returning a fixed-length array is usually a sign of a missing abstraction

虽然@ 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 );
}

1
投票

您的代码返回一个指向局部变量的指针,这很可能产生未定义的行为:

float comp[2];
...
return comp;

您问题的直接答案是使用std::array<float, 2>数据类型。

但是,似乎您想要“滥用”数组来表达复数。我建议引入一个类并返回此类的对象:

struct ComplexNumber{
  float real;
  float imaginary;
}

ComplexNumber WojtekEQgraph::_Wk_N(float k) {
  ComplexNumber c;
  c.real = ...
  c.imaginary = ...
  return c;
}

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);
© www.soinside.com 2019 - 2024. All rights reserved.