ぼんさい塾

ぼんさいノートと補遺に関する素材や注釈です.ミスが多いので初稿から1週間を経た重要な修正のみ最終更新日を残しています.

Cから見たC++ (2)

2010-10-10 21:11:26 | 暮らし
記事一覧(Cの文法(1)~(17),他)
まず覚えるCの文法(progC.pdf)

P1A-1: group クラスの変更例
//-------------------------------------
class group{
protected:
  member *top;
  int max, k;
  member* addr(int);
public:
  group(member*, int);
  member* top_is(void){return top;};
  int max_is(void){return max;};
  virtual void show(void);
  virtual void show(int);
  virtual void add(int, char*, char*);
  virtual void del(int);
  virtual void load(char*);
  virtual void save(char*);
};
//-------------------------------------

P1A-2: 追加関数
//-------------------------------------
void group::show(void){
  member *p=top;
  for(k=0; k<max; k++,p++){
    if(p->id==0){break;}
    printf("%d, %s, %s\n", 
           p->id, p->name, p->mail);
  }
}
void group::load(char *s){
  FILE *fp=fopen(s, "r");
  member *p=top;
  int i; char n[10], m[30];
  if(fp==NULL){printf("-\n"); return;}
  for(k=0; k<max; k++,p++){
    fscanf(fp, "%d %s %s\n", &i, n, m);
    p->id=i; strcpy(p->name, n);
    strcpy(p->mail, m);
    if(p->id==0){break;}
  }
  fclose(fp);
}
void group::save(char *s){
  FILE *fp=fopen(s, "w");
  member *p=top;
  if(fp==NULL){printf("-\n"); return;}
  for(k=0; k<max; k++,p++){
    fprintf(fp, "%d\t%s\t%s\n",
            p->id, p->name, p->mail);
    if(p->id==0){break;}
  }
  fclose(fp);
}
//-------------------------------------

P1.h の group クラスの変更案を P1A-1 に示します.
変更理由は
(1) top と max を見えるようにする.
(2) 全体を表示する show() を追加.
(3) ファイル入出力用の関数を追加.
で,追加した関数の構成例を P1A-2 に示しています.

・top や max の値は見るだけで変更できません.
・show(void) と show(int) は引数が違うので同じ名
  前を使えます(printf や scanf は例外).関数の多
  重定義については別途説明します.

P1.h に変更を施したヘッダファイル P1A.h を作り,

P1A.txt: 入力ファイル
//-------------------------------------
1  Aoki    aoki@xxx.ne.jp
2  Itoh    taro@yyy.jp
5  Tanaka  foo@zzz.ac.jp
0
//-------------------------------------

を準備して,

P1A.cpp: ファイル入出力
//-------------------------------------
#include "P1A.h"
int main(void){
  member *p=new member[10];
  group igo(&p[0], 10);
  igo.load("P1A.txt");
  igo.show();
  igo.del(2);
  igo.save("P1B.txt");
  //delete[] p;
  return 0;
}
//-------------------------------------

をコンパイルして実行し,出力ファイル P1B.txt の内
容を確認してください.

・「member *p; p=new member[10];」によって member
  の配列が動的に作成され,その先頭番地が p に設定
  されます.
・new で作成した配列の削除は delete[] で行います.
  「int *p=new int;」のときは「delete p;」です.
・P1A.cpp では 終了直前に領域を削除しても無意味な
  のでコメントにしています.

[1-2] New演算子 - Wikipedia