CSDN博客

thinking in c++ 卷2

//: C08:Trash.h

// Describing trash.

#ifndef TRASH_H

#define TRASH_H

#include <iostream>

class Trash {

float _weight;

public:

Trash(float wt) : _weight(wt) {}

virtual float value() const = 0;

float weight() const { return _weight; }

virtual ~Trash() {

std::cout << "~Trash()" << std::endl;

}

};

class Aluminum : public Trash {

static float val;

public:

Aluminum(float wt) : Trash(wt) {}

float value() const { return val; }

static void value(float newval) {

val = newval;

}

};

class Paper : public Trash {

static float val;

public:

Paper(float wt) : Trash(wt) {}

float value() const { return val; }

static void value(float newval) {

val = newval;

}

};

class Glass : public Trash {

static float val;

public:

Glass(float wt) : Trash(wt) {}

float value() const { return val; }

static void value(float newval) {

val = newval;

}

};

#endif // TRASH_H ///:~

//: C08:Trash.cpp {O}

// A Trash Recycler.

#include "Trash.h"

float Aluminum::val = 1.67;

float Paper::val = 0.10;

float Glass::val = 0.23;

///:~

sumValue( )模版经由一个容器循环，显示和计算结果：

//: C08:Recycle.cpp

//{L} Trash

// A Trash Recycler.

#include <cstdlib>

#include <ctime>

#include <iostream>

#include <typeinfo>

#include <vector>

#include "Trash.h"

#include "../purge.h"

using namespace std;

// Sums up the value of the Trash in a bin:

template<class Container>

void sumValue(Container& bin, ostream& os) {

typename Container::iterator tally = bin.begin();

float val = 0;

while(tally != bin.end()) {

val += (*tally)->weight() * (*tally)->value();

os << "weight of " << typeid(**tally).name()

<< " = " << (*tally)->weight() << endl;

++tally;

}

os << "Total value = " << val << endl;

}

int main() {

srand(time(0)); // Seed the random number generator

vector<Trash*> bin;

// Fill up the Trash bin:

for(int i = 0; i < 30; i++)

switch(rand() % 3) {

case 0 :

bin.push_back(new Aluminum((rand() % 1000)/10.0));

break;

case 1 :

bin.push_back(new Paper((rand() % 1000)/10.0));

break;

case 2 :

bin.push_back(new Glass((rand() % 1000)/10.0));

break;

}

// Note: bins hold exact type of object, not base type:

vector<Glass*> glassBin;

vector<Paper*> paperBin;

vector<Aluminum*> alumBin;

vector<Trash*>::iterator sorter = bin.begin();

// Sort the Trash:

while(sorter != bin.end()) {

Aluminum* ap = dynamic_cast<Aluminum*>(*sorter);

Paper* pp = dynamic_cast<Paper*>(*sorter);

Glass* gp = dynamic_cast<Glass*>(*sorter);

if(ap) alumBin.push_back(ap);

else if(pp) paperBin.push_back(pp);

else if(gp) glassBin.push_back(gp);

++sorter;

}

sumValue(alumBin, cout);

sumValue(paperBin, cout);

sumValue(glassBin, cout);

sumValue(bin, cout);

purge(bin);

} ///:~

0 0

相关文章推荐

• Thinking in C++ chapter 2
• thinking in c++ part 2
• Thinking in C++, 2nd Edition
• Thinking in C++ 运算符重载
• Thinking in C++(2nd) pdf
• C++学习笔记(Thinking in C++) 二
• thinking in c++ v2
• Thinking in C++2nd