我设置了一堂课:

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*'to'const float'在初始化中”。我了解错误的说法,但是到底说“ const float”以及如何通过分解的内联函数实现我的数组。

有帮助吗?

解决方案

你不能那样做。使用宏:

#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),
};

其他提示

您的返回 (float[]) {....} 是不合法的,因为复合文字将散发自动阵列,并且您将返回一个指针转换为自动阵列,如果控制流量留下该功能,该阵列将被破坏。你得到一个悬空的指针。

这也是C99功能,因此您的代码确实是C ++/C99 :)


编译器在编译时间检测到的第二个问题是数组初始化。这里, 支撑弹 适用。因为 const float* 不能初始化一个 const float[8], ,编译器假设支架弹性,并试图初始化 array[0][0..7] 使用 const float*. 。这也不起作用,这是错误消息所反映的。

您将不得不在运行时使用某种循环填充该数组 return 陈述。


由于您正在使用C ++ C99,为什么不结合功率和使用 [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),
}};

当心那个 inline C ++和C99之间的语义不同。最好确保哪种语义适用于您的程序。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top