質問なのですが、
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件)
- 最新から表示
- 回答順に表示
No.2
- 回答日時:
最終的に何をしたいのかによりますが。
> 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;
}
No.1
- 回答日時:
引数の値自体を変更されたくないなら、
A_parameter *const temp_parameter
ですね。temp_parameter がconstということ。
const A_parameter *temp_parameter
だと、引数のポインターの指す先が変更不可なので、ポインターの指す先が変更可能である
A_parameter *parameter
に代入できません。また、temp_parameterの直前にconstがないので引数自体は変更可能です。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP phpのエラーについて 1 2022/06/27 22:30
- Visual Basic(VBA) ExcelのVBAコードについて教えてください。 1 2022/04/01 12:11
- Visual Basic(VBA) ExcelのVBAコードについて教えてください。 6 2022/06/08 12:55
- C言語・C++・C# const char** p;のとき、free(p)でC4090エラーとなるのはなぜですか 3 2023/03/31 16:28
- C言語・C++・C# Cの関数の引数のconst *charについて 5 2023/04/25 13:05
- JavaScript WordPressのコンタクトフォーム7にて送信者の位置情報を送らせたい 2 2022/09/14 23:28
- JavaScript Javascriptが機能せず原因が分からないので教えて頂きたいです 3 2023/06/04 14:50
- JavaScript セレクトを全て選択されていないと、文字によるエラーメッセージを表示させるコードを調べています 2 2023/06/22 15:48
- JavaScript useStateの分割代入について 1 2022/05/06 10:02
- C言語・C++・C# c言語 int temp = 0; if(isdigit(arr[i])){ temp=arr[i] 2 2022/03/27 01:44
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
fopne で失敗する原因
-
C言語のポインタに直接アドレス...
-
セグメントエラー
-
init関数の意味
-
CImage GetBitsメソッドについて
-
C言語でのconstを返す関数
-
main(int argc,char **argv[])...
-
ポインタについて
-
Run-Time Check Failure #3とい...
-
構造体とfscanf
-
戻り値で構造体を返すことは可...
-
スコープ外でのアドレスの参照...
-
C++で関数ポインタから関数名を...
-
VC++6.0 MFC ダイアログバーを...
-
DIBヘッダへのポインタ
-
c言語で任意のファイルから読み...
-
CWnd::EnableWindow()の扱い方
-
連結リスト 要素の入れ替え
-
参照型で受け取った引数をポイ...
-
nullポインタを逆参照とは?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
セグメントエラー
-
C言語のポインタに直接アドレス...
-
fopne で失敗する原因
-
init関数の意味
-
Run-Time Check Failure #3とい...
-
戻り値で構造体を返すことは可...
-
LPSTR型の初期化について
-
Cで作成したDLL関数をVBから呼...
-
ExcelVBAでのkernel32(64bit)
-
アプリを32bitから64bit移行
-
構造体とfscanf
-
c言語で任意のファイルから読み...
-
デバイスハンドルとは?
-
基本アルゴリズムの『返す』の...
-
main(int argc,char **argv[])...
-
コンストラクタでnewを失敗した...
-
C言語の関数と配列に関する質問
-
ハンドル、アドレス、ポインタ...
-
参照型で受け取った引数をポイ...
-
DLL<->VB間での受け渡し(文字...
おすすめ情報