0

静的な const 配列クラス メンバー (SDL_Surfaces への const ポインターですが、それは無関係です) があり、それを設定するためにループする必要があります。ループが終わったときの const_cast は別として、これは悪い習慣だと聞いていますが、どうすればこれを行うことができますか?

編集:私がやらない理由...

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

この配列の値を取得するには、別の配列から読み取り、別の配列のそれぞれの値に対して関数を実行する必要があるということです。ずっとループしたら、この配列を再び変更することはありません。

EDIT 2: ここで概念的な間違いを犯したと思います。私がやろうとしていたconstnessを削除する代わりに、const_castを何らかの方法でconstにすることは可能ですか? そうでない場合、私はこれを尋ねる少しばかげていました:D

4

5 に答える 5

3

初期化しようとしていて、それが配列の場合は、初期化リストを使用して実行してください。

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

配列がconstあり、値を書き込むために a を使用している場合、未定義の動作const_castを呼び出しています。

これは、ほとんど例外なく受け入れられる慣行ではありません。

于 2010-10-11T07:13:10.447 に答える
1

「論理的な一貫性」を提供する 1 つの方法は、非変更手段を除いて、データにアクセスできないようにすることです。

例えば:

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

private:
    static bar theBar;
};

theBarは定数ではありませんがfoo、それを変更できる唯一のものであるため、それが正しく行われている限り、本質的に (論理的に) 定数がありbarます。

于 2010-10-11T07:34:55.350 に答える
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 に答える
0

まず第一に、なぜ定数と宣言されているものを変更する必要があるのでしょうか?

于 2010-10-11T07:07:59.433 に答える