いつもお世話になります。ミミです。
基本的な質問で申し訳ありません。
以下のクラス定義があるとします。
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、コンソールアプリケーションです。
以上、よろしくお願い致します。
いずれも Yes です。
余談ですが…
後者の TestFunc1 に CHoge の派生クラスが渡される可能性がある場合は正しくありま
せん。
その場合でも TestFunc1 は正しいです。
じゃあ前者の方がいいかと言うと、もっといい方法があります。
コンストラクタで初期化しましょう。
# 連投ごめんよ
> その場合でも TestFunc1 は正しいです。
その場合でも前者の TestFunc1 は正しいです。
> 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];
...
}
aetos さん、maru さん、ご返信ありがとうございます。
質問1
CHoge* pHoge = clsHoge;
このような書き方を行った事が無い為、正しいのかが分かりませんでした。
clsHoge[0] のインスタンスのアドレス指定と同義であると学習します。
質問2
「pHoge[0].」と入力した時、候補ウィンドゥが表示されたので、
「この様な書き方も正しいの?」と思ってしまいました。
(候補ウィンドゥを過信しているわけではないですが)このような使い方もOKと学習し
ます。
後者に関して、TestFunc1 に派生クラスが渡される場合は正しくないという点、
知識の整理もかねて、自分なりに学習してみます。
前者での初期化もそうですが、コンストラクタでの初期化、ごもっともですね。
(そもそも、そのような初期値設定を行うのがコンストラクタですよね・・・)
皆様、ご教授ありがとうございました。