2

タイトルが難解に聞こえる場合はお詫び申し上げます。例を挙げて簡単に説明しましょう。

class A
{
public:
    A(int *flag) : flag_(flag) {}
    void foo();
private:
    void bar();
    int *flag_;
};

問題は、このクラスが flag_ の指す値を変更するのを防ぐことができるかということです。

注 : のようなものを書きたいと考えていますが、 「取り消し不可能な」定数const int * flag_が指す値を作成したくありません。flag私の場合、この値は、変更可能な他のクラスのメンバー変数の値です。

あなたの洞察に感謝します!

4

4 に答える 4

3

const int *flag_;渡される実際の変数の定数を変更するのではなく、flag_の使用方法を定義するだけです。Aのコンストラクターに渡すものは何でも、その定数は変更されません。constは実行時の変更ではなく、コーダーが誤って値を変更するのを防ぐための構文にすぎません。あなたは自分自身をより良くして、const int *const flag_;Aが* flag_を変更するのを防ぎ、flag_が再割り当てされないようにすることができます。

于 2012-06-26T23:58:47.627 に答える
1

問題は、このクラスがflag_が指す値を変更しないようにすることはできますか?

注:const int * flag_のようなものを書きたいと思っていますが、flagが指す値を「取り返しのつかないほど」一定にしたくありません。

だから...あなたはそれを一定にしたい...あなたがそうしないときを除いて?いいえ、解決策はありません。クラスmaintanerとして、flag_X条件でのみ変更される不変条件を維持できます。

編集:私はあなたを誤解したと思います。ポインタconst(またはそれが指すものconst)を作成するだけです。これは他のメンバー変数には影響せず、field_使用方法を制御するだけです。

ちなみに、この別のクラスのメンバーのアドレスを保存しても安全ですか?他のクラスのインスタンスが移動された場合はどうなりますか(任意のベクトルに格納されていますか?移動されてポインタが無効になる場合が多くあります)?インスタンスに自動ストレージ期間が割り当てられ、スコープ外になるとどうなりますか?本当に必要な場合はポインタメンバーを格納するのは問題ありませんが(そうですか?)、考慮する必要があることがあります。

于 2012-06-26T23:58:48.523 に答える
0

int* flag_ はプライベート メンバーです。クラスのクライアント ユーザーは、指す flag_ および flag_ を変更できません。

これがあなたのクラスです。次のようなコードを書くように設計しないでください: *flag_=14;

Scott Meyers の「Effective c++」には、知っておきたいことがいくつかあります。

于 2012-06-27T03:08:32.247 に答える
0

使わconstないとダメです。ただし、クラス A がフラグ ポインターを として宣言した場合const、同じメモリ位置へのポインターを持つ別のクラスが値を変更しても影響を受けないはずです。

于 2012-06-27T00:00:46.880 に答える