クラスインスタンスのポインタについて – プログラミング – Home

クラスインスタンスのポインタについて
 
通知
すべてクリア

[解決済] クラスインスタンスのポインタについて


ミミ
 ミミ
(@ミミ)
ゲスト
結合: 24年前
投稿: 63
Topic starter  

いつもお世話になります。ミミです。
基本的な質問で申し訳ありません。

以下のクラス定義があるとします。

class CHoge{
public:
int nNum;
};

メイン関数中で、クラスインスタンスを5個作成し、メンバ変数 nNumを初期化したい場
合、
自分なら、下記のソースを思いつきます。
void main()
{
CHoge clsHoge[5];
CHoge* pHoge;

for(int nIX=0; nIX<5; nIX++) {
pHoge = &clsHoge[nIX];
TestFunc1(pHoge);
}
}
void TestFunc1(CHoge* pHoge)
{
pHoge->nNum = 0;
}

とある人は下記の通りにコーディングを行いました。
結果的には正しく初期化されていますが、ここで、2点質問させてください。

void main()
{
CHoge clsHoge[5];
CHoge* pHoge = clsHoge;

TestFunc1(pHoge);
}

void TestFunc1(CHoge* pHoge)
{
pHoge[0].nNum = 0;
pHoge[1].nNum = 0;
...
}

質問1.
 CHoge* pHoge = clsHoge;
は、clsHoge[0] のインスタンスのアドレスを指定していると同義でしょうか?

質問2.
 TestFunc1(Hoge* pHoge)では、CHogeクラスのポインタを引数としています。
 この関数内で、
  pHoge[0].nNum = 0;
と、要素値で設定する事は、正しいのでしょうか。

環境は、VC++6.0、コンソールアプリケーションです。
以上、よろしくお願い致します。


引用未解決
トピックタグ
aetos
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
 

いずれも Yes です。


返信引用
aetos
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
 

余談ですが…
後者の TestFunc1 に CHoge の派生クラスが渡される可能性がある場合は正しくありま
せん。
その場合でも TestFunc1 は正しいです。

じゃあ前者の方がいいかと言うと、もっといい方法があります。
コンストラクタで初期化しましょう。


返信引用
aetos
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
 

# 連投ごめんよ

> その場合でも TestFunc1 は正しいです。

その場合でも前者の TestFunc1 は正しいです。


返信引用
maru
 maru
(@maru)
ゲスト
結合: 17年前
投稿: 358
 

> void TestFunc1(CHoge* pHoge)
> {
> pHoge[0].nNum = 0;
> pHoge[1].nNum = 0;
> ...
> }
この関数はpHogeがクラスポインタであることはわかるが、そのサイズはわからない。
呼び出し元の配列サイズをあらかじめ知っている必要がある。

間違いとは言えないけど、配列を渡すなら配列サイズも渡したほうがいいでしょう。

初期化が目的なら
> コンストラクタで初期化しましょう。
でしょうね。

class CHoge{
private:
int nNum;
public:
 CHoge() : nNum(0) {}
};
void main()
{
CHoge clsHoge[5];
...
}


返信引用
ミミ
 ミミ
(@ミミ)
ゲスト
結合: 24年前
投稿: 63
Topic starter  

aetos さん、maru さん、ご返信ありがとうございます。

質問1
 CHoge* pHoge = clsHoge;
このような書き方を行った事が無い為、正しいのかが分かりませんでした。
 clsHoge[0] のインスタンスのアドレス指定と同義であると学習します。

質問2
 「pHoge[0].」と入力した時、候補ウィンドゥが表示されたので、
 「この様な書き方も正しいの?」と思ってしまいました。
 (候補ウィンドゥを過信しているわけではないですが)このような使い方もOKと学習し
ます。

後者に関して、TestFunc1 に派生クラスが渡される場合は正しくないという点、
知識の整理もかねて、自分なりに学習してみます。
前者での初期化もそうですが、コンストラクタでの初期化、ごもっともですね。
(そもそも、そのような初期値設定を行うのがコンストラクタですよね・・・)

皆様、ご教授ありがとうございました。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

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