constのメンバ変数の作成法 – プログラミング – Home

constのメンバ変数の作成法
 
通知
すべてクリア

[解決済] constのメンバ変数の作成法


ナオーバ
 ナオーバ
(@ナオーバ)
ゲスト
結合: 23年前
投稿: 187
Topic starter  

ずーーと#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
 Null
(@Null)
ゲスト
結合: 23年前
投稿: 6
 

コンストラクタの部分で初期化してやれば出来ます。
つまり以下のような感じです。

class hoge
{

};


返信引用
Null
 Null
(@Null)
ゲスト
結合: 23年前
投稿: 6
 

すいません、書き途中で送信してしまいました。
以下、続きです。

class hoge
{
const int x;
const int y;

public:
hoge();
};

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

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

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

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


返信引用
ナオーバ
 ナオーバ
(@ナオーバ)
ゲスト
結合: 23年前
投稿: 187
Topic starter  

すみません、
cppにと書いたのはコンストラクタのつもりでした。
なので、出来ていません。すみません

よろしくお願いします


返信引用
PAI
 PAI
(@PAI)
ゲスト
結合: 23年前
投稿: 359
 

///// 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 にしてやったほうがいいかもしれません。


返信引用
ナオーバ
 ナオーバ
(@ナオーバ)
ゲスト
結合: 23年前
投稿: 187
Topic starter  

わーー書き途中だったんですね。

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


返信引用
PAI
 PAI
(@PAI)
ゲスト
結合: 23年前
投稿: 359
 

あ、ごめんなさい、かぶりました。


返信引用
Null
 Null
(@Null)
ゲスト
結合: 23年前
投稿: 6
 

> ヘッダーに 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
 Null
(@Null)
ゲスト
結合: 23年前
投稿: 6
 

ああ、余計な投稿をしてしまいました。
すいません。


返信引用
YuO
 YuO
(@YuO)
ゲスト
結合: 24年前
投稿: 252
 

とりあえず,[解決]が付いていますが……。

> ずーーと#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で無いメンバ定数である必要はないと思いますよ。


返信引用
ナオーバ
 ナオーバ
(@ナオーバ)
ゲスト
結合: 23年前
投稿: 187
Topic starter  

皆さんありがとうございます。

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

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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました