0

我设置了一个类:

class Example {
    static const float array[3][8];
};

并实施

inline const float below_center(const float pos) {
    return pos - (size / 2); // size is a const float
}

inline const float above_center(const float pos) {
    return pos + (size / 2);
}

inline const float *set_pos(const float x, const float y) {
    return (float []) {
        below_center(x), below_center(y),
        below_center(x), above_center(y),
        above_center(x), below_center(y),
        above_center(x), above_center(y),
    };
}

const float Example::array[3][8] = {
    set_pos(2.0f, 0.0f),
    set_pos(-1.0f, -1.0f),
    set_pos(1.0f, -1.0f),
};

但是当我这样做时,我收到一条错误消息,“在初始化中将'const float*' 转换为'const float'”。我明白错误在说什么,但到底是在说“const float”,以及如何用分解的内联函数来实现我的数组。

4

2 回答 2

2

您的返回(float[]) {....}是不合法的,因为复合文字将发出一个自动数组,并且您返回一个指向自动数组的指针,如果控制流离开该函数,该数组将被破坏。你得到一个悬空指针。

它也是一个 C99 特性,所以你的代码真的是 C++/C99 :)


编译器在编译时检测到的第二个问题是数组初始化。在这里,大括号省略适用。因为 aconst float*无法初始化 a const float[8],所以编译器假定大括号省略并尝试初始化array[0][0..7]使用 that的第一个成员const float*。这也不起作用,错误消息反映了这一点。

您将不得不在运行时使用某种循环自己填充该数组,或者您将不得不在数组初始化中指定初始值,类似于您在return语句中的操作方式。


既然您使用的是 C++C99,为什么不将 power 和 use 结合起来[boost|tr1]::array呢?

inline const boost::array<float, 8> set_pos(const float x, const float y) {
    return (boost::array<float, 8>) {{
        below_center(x), below_center(y),
        below_center(x), above_center(y),
        above_center(x), below_center(y),
        above_center(x), above_center(y),
    }};
}

const boost::array<boost::array<float, 8>, 3> Example::array = {{
    set_pos(2.0f, 0.0f),
    set_pos(-1.0f, -1.0f),
    set_pos(1.0f, -1.0f),
}};

请注意inlineC++ 和 C99 之间的语义不同。最好确定哪些语义适用于您的程序。

于 2010-09-13T18:00:02.447 回答
1

你不能那样做。使用宏:

#define BELOW_CENTER(pos) ((pos) - (size / 2))
#define ABOVE_CENTER(pos) ((pos) + (size / 2))

#define SET_POS(x, y) {               \
    BELOW_CENTER(x), BELOW_CENTER(y), \
    BELOW_CENTER(x), ABOVE_CENTER(y), \
    ABOVE_CENTER(x), BELOW_CENTER(y), \
    ABOVE_CENTER(x), ABOVE_CENTER(y)  \
}

const float Example::array[3][8] = {
    SET_POS(2.0f, 0.0f),
    SET_POS(-1.0f, -1.0f),
    SET_POS(1.0f, -1.0f),
};
于 2010-09-13T18:03:30.780 回答