• 締切済み

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

みんなの回答

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.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; }

全文を見る
すると、全ての回答が全文表示されます。
  • notnot
  • ベストアンサー率47% (4857/10273)
回答No.1

引数の値自体を変更されたくないなら、 A_parameter *const temp_parameter ですね。temp_parameter がconstということ。 const A_parameter *temp_parameter だと、引数のポインターの指す先が変更不可なので、ポインターの指す先が変更可能である A_parameter *parameter に代入できません。また、temp_parameterの直前にconstがないので引数自体は変更可能です。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • const参照をポインタ引数として渡すには?

    Aというクラスがあって、BはAを継承しているとします。 そこで、Bのconst参照を返却する以下の関数定義があったとします。 const B& getB() { return b; //bはB型 } さらに次の関数があります。 void C(A* a) { //適当な処理 } ここでCを以下のように呼ぼうとするとコンパイルエラーになります。 C(getB()); Cは引数として型Aを求めていますが、BはAを継承しているので、 そのまま渡しても問題ないと思います。 次に、Cは引数としてポインタを求めているのにgetBの戻り値の参照をそのまま 渡しているからまずいのだと思い、以下のようにしました。 const B& hoge = getB(); C(*hoge); //参照をポインタに変換 しかし、さらに型が違うとエラーになります。 どこがまずいのでしょうか? それと、上では参照をポインタに変換するために変数hogeを宣言していますが、 それを省略して一気にやる方法はないでしょうか? C(*getB()); のようなやり方がしたいのですが。

  • const の使い方

    お世話になります。 VC5.0からVC2005.NETにソフトの移植をしているのですが、 その際、const の使い方で混乱しております。 環境:WinXP、VC2005.NET 以下のコードをビルドするとコンパイルエラーが出てしまいます。 ネットで検索しても、混乱中の上自分のケースに当てはまっているのか どうかさえも怪しい状態でして・・・ --コード-- #include "stdafx.h" class A { public: void func( const int*& a ); }; void A::func( const int*& a ) { return; } int _tmain(int argc, _TCHAR* argv[]) { int *a; A CA; CA.func( a ); ←※ここでエラー return 0; } --ここまで-- --エラー-- error C2664: 'A::func' : 1 番目の引数を 'int *' から 'const int *&' に変換できません。(新しい機能 ; ヘルプを参照) --ここまで-- 基本的なことですがご教授願います。

  • メンバ関数にconstをつけた際の問題

    C++を勉強中の学生です。 以下のようなコードで問題が起こりました。 class TEST{ private: int mArray[10]; //(int a;) public: int* get_mArray(void) const; //(int get_a(void) const;) }; int* TEST::get_mArray(void) const{ return mArray;    //配列の先頭要素の値を受け取りたい。 } //(関係のありそうな部分のみを抜き出しました) このコードにおいて、関数は値を変えない事が明白なので、constをつける必要性はないのですが(癖でつけた際に発生した問題です)、 なぜconstをつけると動作しなくなるのか知りたいです。 //()で囲った部分を有効にし、 int TEST::get_a(void) const{return a;}という関数はエラーにならなかったのですが、どのような違いがあるのでしょうか? 出たエラーは(visual C++ 2010) 'const int [10]' から 'int *' に変換できません。 というものでした。 ポインタとconst関連の部分を手持ちの本で勉強しなおしたのですが、解答を得られなかったのでこちらで質問させてもらいます。

  • C++のクラスの可変引数化を禁止する方法。

    C++のクラスの可変引数化を禁止する方法。 クラスのインスタンスをprintfの引数にするのをコンパイル・エラーにする方法はないでしょうか? コピーコンストラクタや代入のオーバーロードをprivateにしてもエラーが出ないので方法を探しています。 #include "stdafx.h" class CTest { private: int intdata; public: CTest() : intdata(0) { }; private: void operator =(const CTest& src) {} CTest(const CTest& src) {} }; int _tmain(int argc, _TCHAR* argv[]) { CTest ctest; printf( "%s %p\n", ctest, ctest ); return 0; }

  • ヘッダーファイル内でconst変数を初期化する時にエラー

    ヘッダーファイル内でconst変数を初期化する場合、 以下のようにしているのですが、エラーが出てしまいます。 どのようにすればうまくいくのでしょうか? 環境はVisualC++.NETです。 class abc{ private:  const int x; public:  abc(){   x = 10;  } }

  • 参照型の変数をポインタ引数を持つ関数に引数を書く方法

    C++の参照を使って以下のソースを試したのですが、 memmoveの引数のところでエラーが出ます。 memmoveの引数はポインタ型で合いません。 実体コピーしたい場合、どのようにすればよいのでしょうか? const AA &aとすれば、a自体が関数内で書き換わる心配がないので、 C++の参照型は、ポインタより安全と理解しているのですが その認識は間違っていないでしょうか? struct aa{ int x; int y; }AA; void test(AA &a) { AA b; memmove(b, a, sizeof(AA)); } void main(){ AA c; test(c); }

  • VC++でconst void*に渡す

    Sqlite3.dllの sqlite3_bind_text16に値を渡したいのですが、 3つ目の引数がconst void*となっているのでtextBox1->Textを渡したいので 適当にいろいろやったのですがよくわかりません。 sqlite3_bind_text16(&stmt,1,,-1,0); 他の引数は一応上のとおりです。

  • C#で引数を渡して、スレッド用の関数をよびだすには?

    C#でスレッドを使う場合、引数が渡せません。 具体的には、 Thread temp=new Thread(new ThreadStart(message)); temp.Start(); private void message(){ ~} と、なり、ThreadStart(message)の部分で、 ThreadStart(message(mystr))とし、 private void message(string s){} 書くことができないのです。 しかし、関数に、引数を渡せないのは、不便です。 何か、方法は、ないでしょうか。

  • 「テンプレート」について

    C++でテンプレートについて調べています。 しかし、参考書や参考サイトを見ても下記の例のような、簡易な処理しか載っていないので、 実際にはどのような使われ方をしているのかわかりません。 例1)引数の大小を比較して、小さい方を返す。 template <class T> inline const T& btMin(const T& a, const T& b) { return b < a ? b : a; } 例2)引数の値を入れ替える処理 template <class T> inline void swap(T& a, T& b) { T temp = a; a = b; b = temp; } そこで、参考書や参考サイトなどでは載っていないような、 思いもよらない使われ方をしているものはご存じありませんか? できれば、使われているオープンソースの場所を教えて頂けると嬉しいです。 皆さんどうかよろしくお願い致します。

  • 可変引数をconstで参照渡し

    以下のようなクラスをconstの参照渡しでうけとる、可変引数を持つ関数を作りたいのですが、以下のようにしてもうまくいきません。 何か良い方法はないものでしょうか? template<class TT> class vector3{ public:  enum{NUM=3};  TT x[NUM];  void Sum(const int num,...); }; template<class TT> void vector3<TT>::Sum(const int num,const ...){  int i,j;  va_list list;  va_start(list,num);  for(i=0;i<NUM;i++){   x[i]=va_arg(list,&vector3<TT>).x[i];  }  for(j=1;j<num;j++){   for(i=0;i<NUM;i++){    x[i]+=va_arg(list,&vector3<TT>).x[i];   }  }  va_end(list); }

このQ&Aのポイント
  • E495のBIOSを1.28に更新したところ、Firefoxで動画サイト再生中にPCが応答しなくなることが頻発
  • BIOSに問題があるのか?
  • 現在はBIOSの「Secure Rollback Prevention」をDisableにしてBIOSを1.26に戻して様子見中
回答を見る