天天看点

学习类的抽象——《C++编程风格》读书笔记(一)

一:类的抽象要点

1.将共同的抽象提取出来放到基类。

2.一个类应该描述一组对象。

3.如果派生类之间的区别在于属性,则用数据成员来表示;如果在于行为,则用虚函数来表示。

4.如果通过公有继承来产生派生类,那么这个派生类应该是其基类的特化。

5.多态并不是所有程序设计问题的解决方案。

二:实例

实现一个程序,程序的功能是确定一改计算机中的各种配置的价格。配置一台计算机时,我们需要作出下面两个选择:一个是扩展卡(card),一个是显示器(monitor),扩展卡插槽有三种选择:光驱、磁带机、或者网络接口;显示器有两种选择:单色或者双色。并且考虑这两种部件可能的折扣。

#include <stdio.h>

class Component

{

private:

int price_;

char *name_;

int rebate_;

public:

Component(int p,char *n,int r = 0);

int netPrice();

int price() {return price_;}

char* name() {return name_;}

int rebate() {return rebate_;}

};

Component::Component(int p,char *n,int r)

{

price_ = p;

name_ =n;

rebate_ = r;

}

int Component::netPrice()

{

return price_ - rebate_;

}

class Card:public Component

{

public:

Card(int p,char *n,int r = 45):Component(p,n,r){}

};

class Monitor:public Component

{

public:

Monitor(int p,char *n,int r = 0):Component(p,n,r){}

};

Card Network(600,"Network");

Card CDRom(1500,"CDRom",135);

Card Tape(1000,"Tape");

Monitor Color(1500,"Color");

Monitor Monochrome(500,"Mono");

class Computer

{

Card *card;

Monitor *mon;

public:

Computer(Card*,Monitor*);

int netPrice();

void print();

};

int Computer::netPrice()

{

return mon->netPrice() + card->netPrice();

}

Computer::Computer(Card *c,Monitor *m)

{

card = c;

mon = m;

}

void Computer::print()

{

printf("%s %s,net price = %d/n",card->name(),mon->name(),netPrice());

}

int main()

{

Computer mn (&Network,&Monochrome);

Computer mc(&CDRom,&Monochrome);

Computer mt(&Tape,&Monochrome);

Computer cn(&Network,&Color);

Computer cc(&CDRom,&Color);

Computer ct(&Tape,&Color);

mn.print();

mc.print();

mt.print();

cn.print();

cc.print();

ct.print();

return 0;

}

参考书籍:c++ programming style by Tom Cargill