- 締切済み
constとポインタと引数について
質問なのですが、 class cParameter { private: A_parameter* parameter; // 構造体A_parameter public: void SetParameter( const A_parameter* temp_parameter){ parameter = temp_parameter; } } この場合 >>parameter = temp_parameter; でエラーを表示されて IntelliSense: 型 "const A_parameter*" の値を型 "A_parameter*" のエンティティに割り当てることはできません ビルドすると error C2440: '=' : 'const A_parameter*' から 'A_parameter*' に変換できません。 と言われます。 引数の形を const A_parameter* temp_parameter ではなく A_parameter* const temp_parameter だと大丈夫なのですが、これだと引数の値を変更できるので私の願望とは違う事になってしまいます。 何か解決策はないのでしょうか。 よろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- Tacosan
- ベストアンサー率23% (3656/15482)
キャストで万事解決. あとでほかの誰かに張り倒されるかもしれんが私の知ったことじゃないし.
- akinomyoga
- ベストアンサー率85% (100/117)
最終的に何をしたいのかによりますが。 > A_parameter* const temp_parameter > だと大丈夫なのですが、これだと引数の値を変更できるので私の願望とは違う事になってしまいます。 ↑の宣言の仕方だと、厳密に書くと「引数の値自体は変更できなくて、引数の "指し示す先の構造体" が変更できる」という事になるので、書き間違えていらっしゃるか何か勘違いしていらっしゃるのだと思いますが…。(No1 の方は引数のポインタの値を書き換えないのが "願望" であると解釈されたようですね。) 私は、質問者さんの願望は、以下の (b) だと最初思ったのですが。 (a) 受け取ったポインタ引数の値を変更したくない (しかし、ポインタの引数の指し示す先の構造体は変更しても良い) というのであれば、回答 No1 の方の言う通り引数を void SetParameter(A_parameter* const temp_parameter); にすれば良いです。 (b) 引数の指し示す先の構造体を全く変更しないという場合は、そもそもメンバの宣言の所で private: const A_parameter* parameter; // 構造体A_parameter の様にするべきです。 (c) 引数の指し示す先の構造体は変更したくないが、メンバの parameter の内容は後で書き換えたいという場合は、そもそもポインタとしてではなく、直接の構造体としてメンバ宣言するべきです。 private: A_parameter parameter; public: void SetParameter(const A_parameter* temp_parameter){ this->parameter = *temp_parameter; }
- notnot
- ベストアンサー率47% (4900/10358)
引数の値自体を変更されたくないなら、 A_parameter *const temp_parameter ですね。temp_parameter がconstということ。 const A_parameter *temp_parameter だと、引数のポインターの指す先が変更不可なので、ポインターの指す先が変更可能である A_parameter *parameter に代入できません。また、temp_parameterの直前にconstがないので引数自体は変更可能です。