• ベストアンサー

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

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

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

エラーが出るのは、const 型の変数(実は定数)に代入をしているからですね。 No.1 の方の方法が普通使われます。 これは、(代入ではなく)「初期化」なので、文字通り初期化の使えます。 この場合の、() の中は、定数である必要はないので、 abc(int n) : x(n) { } のような構文も可能です。 No.2 の方の方法は、意味としては(x が static メンバーになるので)異なってきますが、すべてのインスタンスで、定数である 10 で初期化するのであれば、(どのインスタンスから見ても、x が 10 であることしかわからないので)実際上は、同じになります。

参考URL:
http://www.st.sakura.ne.jp/~taka/C++/3.htm
hare_gu2005
質問者

お礼

なるほど。勉強になりました。 URLも参考にさせていただきます。 ありがとうございました。

その他の回答 (2)

  • MASATO3
  • ベストアンサー率60% (27/45)
回答No.2

class abc{ private:  static const int x = 10; public:  abc(){  } }

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.1

class abc{ private:  const int x; public:  abc() : x(10) {} }

関連するQ&A

  • static constメンバ変数(配列)の初期化について

    C++初心者です。 constメンバ変数の初期化について教えてください。 クラスの中に、static constメンバ変数(配列)を持ちたいのですが、 <コード1> class hoge { public : hoge(){}; virtual ~hoge(){}; static const int fuga[2] = {1, 2}; }; とすると、VC++ 2005では、 error C2059: 構文エラー : '{' error C2334: '{' の前に予期しないトークンがありました。関数の本体は無視されます というエラーが発生します。 何がいけないのでしょうか? また、下の様にするとOKでした。 <コード2> class hoge { public : hoge(){}; virtual ~hoge(){}; static const int fuga[2]; }; const int hoge::fuga[2] = {1,2}; こうすればコンパイルが通る事は分かったのですが、なぜこんな面倒な事をしないといけないのかが分かりません。 コード1では何がいけないのでしょうか? 以上、よろしくお願いします。

  • 構造体を生成時にわざわざ初期化しないようにしたいのですが。

    ヘッダーファイルにstruct XXXを定義して、 struct XXX{ int x; int y; } 生成時に、 struct XXX param = {0,0}; のような初期化を毎回行う必要がないようにしたいのですが、 構造体を利用している時点でそれは不可能でしょうか? そこで、structをやめて、以下のようにclassにしてしまえば解決しそうですが、 class XXX{ public: XXX(): x(0); y(0); {}; ~XXX(){}; int x; int y; } この解決方法について同じような経験あるかたいらっしゃいましたらコメントいただけませんか? 私的には少し大げさなような気がしています。 classにpublic変数を持たせるのも変な感じがしますし、そもそも構造体用のclassを作ることがあるのかなって疑問に思ってます。 お気づきかと思いますが経験が浅いので、この解決方法が常套手段なのかどうかが知りたいところです。 お詳しい方、つっこみでも良いのでお願いします。

  • 変数の初期値

    へんてこな質問かもしれません・・・ class Syokika{   public static void main(String args[]){     int[] a = new int[1];     System.out.println(a[0]);   } } を実行するとどうなるかという問題なのですが、 「変数が初期化されていない」 というエラーが出ると思っていたのですが、 答えは「0と表示される」でした・・・ で、解説を見ると、「配列が生成されるときに初期値が生成される。intの場合は0だ」と書いてありました。 でも、たんにint a;とした場合にaを参照しようとすると初期化されてないですよね・・・? これはどういうことなのでしょうか・・・?

    • ベストアンサー
    • Java
  • コンパイルエラー: LNK2001

    今、ベクトル計算を簡単にするクラスを作ってみようとしています。 //vector3.h template<class TT> class vector3{ public:   enum{NUM=3};   TT x[NUM];   void set(const TT *vv)void set(const TT *vv){     int i;     for(i=0;i<NUM;i++){       x[i]=vv[i];     }   } }; のように、set関数をクラスの中に書いていると問題無いのですが、以下のように、 //vector3.h template<class TT> class vector3{ public:   enum{NUM=3};   TT x[NUM];   void set(const TT *vv); }; //test.cpp #include"vector3.h" template<class TT> void vector3<TT>::set(const TT *vv){   int i;   for(i=0;i<NUM;i++){     x[i]=vv[i];   } } と、cppファイルの中に書き換えると以下のようにエラーが出るようになります。 error LNK2001: 外部シンボル ""public: void __thiscall vector3<double>::set(double const *)" (?set@?$vector3@N@@QAEXPBN@Z)" は未解決です。 fatal error LNK1120: 外部参照 1 が未解決です。 これはいったい何故なのでしょうか? 使用しているのはVisualC++2008ExpressEditionです 宜しくお願いします。

  • ヘッダファイルの2重のインクルードについて

    ある書物に「ヘッダファイルを複数回インクルードすると、それを”再定義”することによるエラーになる」と書いてありますたが、以下のようなヘッダファイルを作りそれを数回インクルードしても何ら異状が無くコンパイルできました。 math.h→ヘッダファイル名 #define max(a,b)  ((a)>(b)?(a):(b))→ヘッダファイルの内容 c ファイル #include<stdio.h> #include"math.h"←複数回インクルード #include"math.h"←複数回インクルード int main(void){ int x=1,y=2; printf("max(x,y)=%d\n",max(x,y)); return 0; } 環境としては、RedHat Linuxでviです。 何ゆえ、エラーにならないのか良く解りません。 宜しくお願いします。

  • クラスを公開する部分を制限するには?

    以下の例のようなクラスを書きました。 ========================== #include<Hoge.h> class Moge{ public:  int getCountHoge(void); private:  Hoge* d; }; ========================== これをライブラリとして、他の人に使ってもらうように 公開しようと考えています。 ただ、上記のままヘッダーファイルを配ってしまうと、 使用者にとって不要だと思われる Hoge.h の include が 発生してしまいます。 実際には、Hoge.h は 他のクラスを使用したり、 inline 関数などを多用した少々重い実装となっています。 なんらかの方法で、これを抑制できないでしょうか? 試しに以下のようにprivate 部分を削除したヘッダーファイルを 公開用に別途用意してみましたが、実行時エラーとなってしまいました。 (ライブラリコンパイル時は元のヘッダーファイルを使用して、 使用者側ソースは下記ヘッダーファイルを使用しました。) ========================== class Moge{ public:  int getCountHoge(void); }; ========================== よろしくお願いします。

  • C言語のヘッダファイルの使い方

    ヘッダファイルの使い方について質問です。 ソースファイルA、ソースファイルBで共有して使用したい変数がある場合、 Aでは「int a」と宣言し、Bでは「extern int a」と宣言すれば 同じ変数を共有出来ると認識しています。 それをヘッダファイルへ記述しておきたい場合にはどのように 宣言しておけば良いのでしょうか? ヘッダファイルに「int a」と宣言した場合は両方のソースファイルで includeした時に多重定義でエラーとなります。 では「extern int a」と宣言しておいて、両方のソースファイルで includeするのが正しいのでしょうか? 初歩的な質問で申し訳ないですが、有識者の方、教えてください。

  • ヘッダのインクルード時のエラー

    初歩的な質問で恐縮です。 以下のようなファイルの構成でc++のプログラムを組んでいます。 <header.h> class H { public: virtual void func() = 0; }; <fileA.cpp> #include "header.h" class A : public H { public: void func() {} }; <fileB.cpp> #include "header.h" class B : public H { public: void func() {} }; <main.cpp> #include "fileA.cpp" #include "fileB.cpp" int main() { A a; B b; a.func(); b.func(); return 0; } これをビルドしようとすると、「クラス"H"を再定義しようとしています」とエラーが出てコンパイルができません。理屈は分かるのですが、これの対処方法が分かりません。この場合、header.hはJAVAにおけるInterfaceのような役割としてそれを使うfileA.cpp、fileB.cppの両者にインクルードしておきたいのです。これはどのようにして対処すべきなのでしょうか?

  • const char*のグローバル変数として使うのはどうしたら良いでし

    const char*のグローバル変数として使うのはどうしたら良いでしょうか? 以下のような動作を実装しようとしています。 mainからデータファイルの値を読み込みます。 その際、読み込むデータファイルのファイル名は別のコンフィグファイルに記載されているので、コンフィグから、データファイルのファイル名を読み込んで、データファイルをオープンする必要があります。 これをファイルを分割して実装しているのですがうまくいきません。 説明のため、データファイル名をmainから出力する実際と同じファイル構成のコードを作成しました。 以下のように5つのファイルに分けています。この際、データファイルのファイル名をconst char* filenameとしています。 ソースファイル #1: main.cpp //util.cppでfilenameに設定されたファイル名を表示する。 ソースファイル #2: set_filename.cpp //グローバル変数であるfilenameにコンフィグファイルに記載されているファイル名を設定する関数が定義されています。 ヘッダファイル #1: etc.h   //filenameの宣言が記載されていて、main.cpp, set_filenameでincludeされている。 ヘッダファイル #2: global.h //filenameの定義が記載されている。 ヘッダファイル #3 : set_filename.h //set_filename.cpp関数のプロトタイプ宣言 このような場合、set_filename.cpp内の関数で設定したfilenameがmain内で違う値に変わってしまいます。下のソースの例では、data.txtと出力されるのが期待値ですが、ゴミ値が表示されます。環境はVisual C++ 2008です。 どうして、set_filenameで設定したファイル名が変わってしまうのでしょうか? また、所望の動作はどのようにソースを変えれば実装できるのでしょうか? サンプルのソースは以下のとおりです。 -----main.cpp---------------- #include "etc.h" #include "global.h" #include "util.h" using namespace std; void main() { ifstream ifs("config.txt"); set_filename(ifs);  //config.txtには「data.txt」と記載しています。 cout<<filename<<endl; } -- ---------set_filename.cpp------- #include "etc.h" #include "util.h" void set_filename(ifstream &ifs) { string temp; ifs>>temp; filename=temp.c_str(); cout<<filename<<endl; ifs.close(); } ---- ---------etc.h----------------- #include <fstream> #include <cstdio> #include <string> #include <iostream> extern const char* filename;  //データファイル名です。 -- ----global.h-------- const char* filename; -- ----set_filename.h--- using namespace std; void set_filename(ifstream &ifs); --

  • constでパースエラー

    <?php class hoge { const MOGE = 'moge'; function poge() { echo 'poge'; } } ?> なコードを書くと、 Parse error: syntax error, unexpected T_CONST, expecting T_OLD_FUNCTION or T_FUNCTION or T_VAR or '}' in ...\test.php on line 5 とのエラーがでます。 constの部分をコメントアウトすればエラーはでません。 環境は、WindowsのXAMPP環境で、PHPのバージョンを4に変更してテストしているところなのですが... PHP Version 4.4.8 Apache/2.2.8 PHP5の環境では、正常に動作しました。 よろしくお願いいたします。

    • ベストアンサー
    • PHP

専門家に質問してみよう