1

各データオブジェクトがControlViewによって表示されるゲームを書いています。ControlViewがデータオブジェクトを表示するように設定されている場合、それを変更しないでください。constを使用してこの規則を適用したいと思います。ただし、後でControlViewを使用したユーザーの操作に応じて、データが変更される場合があります。したがって、非定数ポインタを格納する必要があります。これが受け入れられ、const_castの正しい使用法かどうか疑問に思っています。以下の骨格コード

class Data
{
  int m_int;
  public:
    void add(int i)  { m_int += i ; };
 };

class ControlView
{
 Data* m_data;
 public:
 void set_data(const Data* d)  //this call should not change d 
        { 
            m_data=const_cast<Data*>(d); //cast needed to compile
        }; 

        void manipulate_data(int x)
        { 
            m_data->add(x);
        }
};
4

3 に答える 3

2

オブジェクトを変更したい場合は、作成しないでくださいconstconstたとえば、を介してオブジェクトを変更することconst_castは、未定義の動作です。

constしたがって、には使用しないでください。ただし、コードで使用できるものm_dataは他にもいくつかあります。const

  • 関数の引数は。で保護できますconst。通常、ポインタではなく、ポインタが指すオブジェクトを気にするので、これは通常あまり意味がありません。dただし、コード内で誤って再ポイントするなどのバグを回避するのに役立ちます。
void set_data(Data * const d); // const pointer to (non-const) Data
// this means the function can not change d (the pointer), but it can
// change the object that d points to.
  • 非変更機能を作成できますconst。これは、関数がオブジェクトを変更しないことを宣言します(mutableメンバーが存在する場合を除く)。このような関数のメンバーを変更しようとすると、コンパイラはエラーになります。これらの関数は、オブジェクトに対して呼び出すことができる唯一の関数でもありconstます。
Data * get_data() const; // this function doesn't change anything

mutableメンバーがいる場合は、const関数から変更できますが、これを悪用しないでください。これは、ミューテックスやキャッシングなどの内部的なものを対象としています。

また、参照は常にであることに注意してくださいconst。別のオブジェクトを指すように再割り当てすることはできません。それらが参照するオブジェクトは、constまたはnon-constにすることができます。

最後のヒント:宣言を右から左に読んでください。

Data       *       d;   // pointer to Data (both can be changed)
Data       * const d;   // const pointer to Data (data can be changed)
Data const *       d;   // pointer to const Data (pointer can be changed)
Data const * const d;   // const pointer to const Data (neither can be changed)

Data         &       d;   // reference to non-const Data
//Data       & const d;   // invalid - all references are const
Data const   &       d;   // reference to const Data
//Data const & const d;   // invalid - all references are const
于 2012-12-02T05:09:09.667 に答える
2

この場合、いいえ、使用しないでくださいconst。そうした場合、誰もがconstパラメータとしてaを渡せるようになり、後で未定義の動作に遭遇する可能性があります。

 const Data d;
 ControlView c;
 c.setData(&d);    //legal, because setData takes a const as parameter
 c.manipulateData(0);  //undefined behavior, modifying an originally const object
于 2012-12-02T05:13:32.883 に答える
0

const data *dあなたは何を意味するのかを理解する必要があります。これは、ポインターdを変更できることを意味しますが、ポインターは、つまり不変dであるタイプのオブジェクトを指します。Dataconst

あなたが持っているべきものは

void set_data(Data * const d)  //this call should not change d 
{ 
    m_data=d;
};

コードのビットはData * const d、ポインタdがメソッドによって変更できないことを意味しますが、dは変更可能なオブジェクトを指します。

私の哲学は、キャストを使用しているときは、何か間違ったことをしている可能性があるということです。それらを避けるようにしてください。

于 2012-12-02T05:09:16.507 に答える