constのメンバ変数の作成法

[戻る]
ナオーバ 2002/10/22(火) 15:29:02
ずーーと#defineだった定数をconstメンバ変数にしたいのですが
うまくいきません。

ヘッダーに const int m_nSize; cppに m_nSize = 100; だと
「オブジェクトコンストラクタの初期化リストで初期化されませんでした。」
がでます。

ヘッダーに const int m_nSize= 100; だと
純粋仮想関数の宣言に構文上の誤りがあります、'=0' でなければなりません。
がでます。

ヘッダーに int m_nSize; cppに const m_nSize = 100;
にするとエラーはでないのですが、変です
OnDrawに
 CString szTmp ;    szTmp.Format("%d", m_nSize );
 pDC->TextOut( 10, 10, szTmp );
とすると不定値になっています。

クラスのメンバにconst定数は出来ないんでしょうか?

WIN2000 SP2/VC6.0 SP5/MFC使用

Null 2002/10/22(火) 15:40:25
 コンストラクタの部分で初期化してやれば出来ます。
 つまり以下のような感じです。

class hoge
{

};

Null 2002/10/22(火) 15:44:34
 すいません、書き途中で送信してしまいました。
 以下、続きです。

class hoge
{
  const int x;
  const int y;

public:
  hoge();
};

hoge::hoge()
  : x(100), y(-1)
{
};

 これで初期化することが出来ます。
 なお、このとき初期化される順序は宣言順ですので、

hoge::hoge()
  : y(-1), x(100)
{
};

 と書いたとしても、x → y の順で初期化されます。

ナオーバ 2002/10/22(火) 15:46:38
すみません、
cppにと書いたのはコンストラクタのつもりでした。
なので、出来ていません。すみません

よろしくお願いします

PAI 2002/10/22(火) 15:49:51
///// Hoge.h
class Hoge
{
    const int m_HogeHoge;
};


///// Hoge.cpp
// コンストラクタ
Hoge::Hoge() : m_HogeHoge( 100 ) 
{

}

としてやればよろしいかと、これを「初期化子」とか「初期化リスト」とかいいます。


ただ、#defineの変わりであれば、

///// Hoge.h
class Hoge
{
    static const int m_HogeHoge;
};


///// Hoge.cpp
// (グローバルスコープ中で)
const int Hoge::m_HogeHoge = (100); 


と、static にしてやったほうがいいかもしれません。

ナオーバ 2002/10/22(火) 15:52:10
[[解決]]
わーー書き途中だったんですね。

できました
ありがとうございます。

PAI 2002/10/22(火) 15:54:35
あ、ごめんなさい、かぶりました。

Null 2002/10/22(火) 15:59:30
> ヘッダーに const int m_nSize; cppに m_nSize = 100; だと
> 「オブジェクトコンストラクタの初期化リストで初期化されませんでした。」
> がでます。
 というメッセージが出ると言うことは、

hoge::hoge()
{
  x = 100;
};

 という書き方をしていたからではないのでしょうか?

hoge::hoge()
  : x(100), y(-1)
{
};

 という書き方をしていれば、エラーメッセージは出ないはずですが?

 {} の中に書くのと、hoge::hoge() : の後ろに書くのでは違いが出ます。

hoge::hoge()
{
  x = 100;
};

 と書くと、operator= が使われ、

 const int x;
 x = 100;

 と同じような意味になり、

hoge::hoge()
  : x(100)
{
};

 と書くと、x のコンストラクタが使われますので、

 const int x = 100;

 と同じ意味になります。

Null 2002/10/22(火) 16:00:19
 ああ、余計な投稿をしてしまいました。
 すいません。

YuO [E-Mail] 2002/10/22(火) 17:38:29
とりあえず,[解決]が付いていますが……。


> ずーーと#defineだった定数をconstメンバ変数にしたいのですが
> うまくいきません。

C++の仕様的には,
class foo {
public:
    static const int const_member_variable = 100; // static!
};
みたいなことができるのですが,VC++(.Netは不明ですが)では対応していません。
整数に限りますが,よくある逃げ方で,
class foo {
public:
    enum {
        const_member_variable = 100
    };
};
で代用することができます。

#defineの代わりですから,staticで無いメンバ定数である必要はないと思いますよ。

ナオーバ 2002/10/22(火) 18:00:53
[[解決]]
皆さんありがとうございます。

定数なのでなんとなく#defineでしていました。
constにするので、見直したらメンバの方がよさそうなので
メンバにしようとしたら、うまくいかなかったのです。

いろいろ貴重な情報ありがとうございます。
もっとがんばりやす

古いスレッドには追加発言できません。