ずーーと#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使用
コンストラクタの部分で初期化してやれば出来ます。
つまり以下のような感じです。
class hoge
{
};
すいません、書き途中で送信してしまいました。
以下、続きです。
class hoge
{
const int x;
const int y;
public:
hoge();
};
hoge::hoge()
: x(100), y(-1)
{
};
これで初期化することが出来ます。
なお、このとき初期化される順序は宣言順ですので、
hoge::hoge()
: y(-1), x(100)
{
};
と書いたとしても、x → y の順で初期化されます。
すみません、
cppにと書いたのはコンストラクタのつもりでした。
なので、出来ていません。すみません
よろしくお願いします
///// 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 にしてやったほうがいいかもしれません。
わーー書き途中だったんですね。
できました
ありがとうございます。
あ、ごめんなさい、かぶりました。
> ヘッダーに 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;
と同じ意味になります。
ああ、余計な投稿をしてしまいました。
すいません。
とりあえず,[解決]が付いていますが……。
> ずーーと#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で無いメンバ定数である必要はないと思いますよ。
皆さんありがとうございます。
定数なのでなんとなく#defineでしていました。
constにするので、見直したらメンバの方がよさそうなので
メンバにしようとしたら、うまくいかなかったのです。
いろいろ貴重な情報ありがとうございます。
もっとがんばりやす