プロが教える店舗&オフィスのセキュリティ対策術

質問なのですが、

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
だと大丈夫なのですが、これだと引数の値を変更できるので私の願望とは違う事になってしまいます。


何か解決策はないのでしょうか。
よろしくお願いします。

A 回答 (3件)

キャストで万事解決.



あとでほかの誰かに張り倒されるかもしれんが私の知ったことじゃないし.
    • good
    • 0

最終的に何をしたいのかによりますが。



> 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;
}
    • good
    • 1

引数の値自体を変更されたくないなら、


A_parameter *const temp_parameter
ですね。temp_parameter がconstということ。

const A_parameter *temp_parameter
だと、引数のポインターの指す先が変更不可なので、ポインターの指す先が変更可能である
A_parameter *parameter
に代入できません。また、temp_parameterの直前にconstがないので引数自体は変更可能です。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!