p->Show()の意味は?

解決


カド  2002-11-20 22:41:49  No: 50681  IP: [192.*.*.*]

C++の勉強を始めたばかりです。よろしく回答お願いします。
以下のプログラムにおいて、全員表示にて実行されるp->Show()は、”pの示すデータを使ってShowを実行しろ”という解釈で良いのでしょうか。実際にそのように動くのでそれでよいと思うのですが、いろいろな本を読んでもそのような記述はなく、単にポインタでアクセスできるとしか書かれていないので質問させて頂きました。

#include  <stdio.h>
#include  <string.h>
#include  <iostream.h>

////// クラス宣言  ///////////////////////////////////////////////////

class  CPerson    //////////////////////// 個人情報クラス
{
private :  // 以下は外から直接アクセスできない
  char  Name[ 20 ];      // 名前
public :  // 以下は外からアクセスできる
  CPerson( char* name)// コンストラクタ
  {
  strcpy( Name, name );
  Next = NULL;
  };

  void  Show();    // 個人情報の表示
  CPerson*  Next;    // 次の個人情報へのポインタ
};

class  CAddress  //////////////////////// アドレス帳クラス
{
private :
  CPerson*  pPerson;    // 先頭の個人情報へのポインタ
  void  AddList( CPerson* pAdd );// 個人情報の追加処理を行う
public :
  CAddress(){  pPerson = NULL;  };        // コンストラクタ
  ~CAddress();        // デストラクタ
  void  Show();      // 一覧を表示する
  void  AddPerson( char* name);//, char* address );  // 個人情報を追加する

};

////// メンバ関数のインプリメンテーリョ///////////////////////
void  CPerson::Show()
{
  cout << Name << '\t' << '\n';
}

CAddress::~CAddress()
{
  CPerson*  p = pPerson;
  while ( p )
  {
    pPerson = p->Next;
    delete p;
    p = pPerson;
  }
}
void  CAddress::Show()
{
  cout << "Name\tAddress\n";
  CPerson*  p = pPerson;
  while ( p )
  {
    p->Show();
    p = p->Next;
  }
}

void  CAddress::AddPerson( char* name)
{
  CPerson*  p = new CPerson( name);
  if ( pPerson == NULL )  {pPerson =p; return; }//1回目
  CPerson*  p1 = pPerson;
  while ( p1->Next ){//1と2回目以外
    p1 = p1->Next;
  }
  p1->Next = p;
}
//// ** main ////////////////////////////////////////////////////
int  main()
{
  CAddress  MyAddress;
  while ( 1 )
  {
    char  name[ 20 ];
    cout << "\n名前を入力してください(0:終了):";
    cin >> name;
    if ( name[ 0 ] == '0' )  break;
    MyAddress.AddPerson( name);
  }
  while ( 1 )
  {
    char  sel;
    cout << "\n表示する番号(A:全員表示 Q:終了)";
    cin >> sel;
    if (sel == 'a' )
      MyAddress.Show();
    else if (sel == 'q' )
      break;
  }
  return 0;
}

編集 削除
YuO  2002-11-20 23:34:20  No: 50682  IP: [192.*.*.*]

まず,C/C++において,メンバのアクセスは,
・オブジェクト(o)
o.member
・ポインタ(p)
p->member または (*p).member
・リファレンス(r) [参照とも]
r.member
のようにアクセスします。
で,このことはmemberがメンバ変数だろうとメンバ関数だろうと一緒です。

これをどのように解釈するかは自由です。
私が説明する場合,データという言葉は出てこないですが……。


それから,iostream.hは標準でないので使わない方がよいです。
#include <iostream>
とします。最初は名前空間とかややこしいと思うので,
#include <iostream>
using namespace std;
としておくとよいでしょう。
#listとかvectorとか使うと簡単になると思います。

編集 削除
カド  2002-11-21 07:38:16  No: 50683  IP: [192.*.*.*]

YuOさん  有難うございます。
再度質問させてください。質問内容は同じことですが・・・。
下記Show()において、Nameはpの指すCPersonのNameが使用されるということで良いのでしょうか?

void CPerson::Show()
{
cout << Name << '\t' << '\n';
}

編集 削除
YuO  2002-11-21 09:51:35  No: 50684  IP: [192.*.*.*]

そういうことです。

編集 削除
カド  2002-11-21 12:18:57  No: 50685  IP: [192.*.*.*]

有難うございました。

編集 削除