0

我有一个静态 const 数组类成员(指向 SDL_Surfaces 的 const 指针,但这无关紧要),并且必须遍历它才能填充它。除了当我完成循环时的 const_cast (我听说这是不好的做法)之外,我将如何去做呢?

编辑:我不只是这样做的原因......

static SDL_Surface *const myArray[3];
...
class::myArray[3] = {...};

是我需要从不同的数组中读取并在不同数组的各自值上运行一个函数,以便获取该数组的值。一旦我一直循环,我就再也不会改变这个数组了,所以我看到它的方式应该是 const。

编辑2:我想我可能在这里犯了一个概念上的错误。是否有可能以某种方式进行 const_cast 来制作 const,而不是删除它的 constness,这就是我想要做的?如果不是,那我问这个有点傻:D

4

5 回答 5

3

如果您尝试初始化它,并且它是一个数组,只需使用初始化列表即可:

static const int myarray[] = {1,2,3,4,5,6};
于 2010-10-11T07:08:22.050 回答
3

如果您的数组是const并且您正在使用 aconst_cast使您能够将值写入其中,那么您正在调用未定义的行为

这几乎是普遍不可接受的做法。

于 2010-10-11T07:13:10.447 回答
1
typedef boost::array< const SDL_Surface *, 100 > surfaces_t;

class A {
   static const surfaces_t surfaces;
};

surfaces_t initialize_surfaces()
{
   // ...
}

const surfaces_t A::surfaces = initialize_surfaces();

至于编辑2:声明后您不能更改对象的类型。强制转换不会这样做,这在 C++ 中是不可能的。强制转换所做的是从另一种类型的表达式中形成一个给定类型的表达式,并具有不同类型强制转换的不同语义。对于 const_cast,您可以添加/删除 const,也可以添加/删除 volatile,仅此而已。

于 2010-10-11T07:14:00.233 回答
1

提供“逻辑常数”的一种方法是使数据不可访问,除非通过非变异方式。

例如:

class foo
{
public:
    const bar& get_bar() { return theBar; }

private:
    static bar theBar;
};

即使theBar不是恒定的,因为foo它是唯一可以修改它的东西,只要它正确地这样做,你基本上(逻辑上)就有一个 constant bar

于 2010-10-11T07:34:55.350 回答
0

首先,为什么您需要更改声明为常量的内容?

于 2010-10-11T07:07:59.433 回答