C++编程思想 第1卷 第16章 模板介绍 以值存放对象

实际上,如果我们没用模板,那么在一个一般的容器内创建对象的一个拷贝
是一个复杂的问题。

使用模板,事情就相对简单了,只要说我们存放对象而不是指针就行了

//: C16:ValueStack.h
// From Thinking in C++, 2nd Edition
// Available at http://www.BruceEckel.com
// (c) Bruce Eckel 2000
// Copyright notice in Copyright.txt
// Holding objects by value in a Stack
#ifndef VALUESTACK_H
#define VALUESTACK_H
#include "../require.h"

template<class T, int ssize = 100>
class Stack {
  // Default constructor performs object
  // initialization for each element in array:
  T stack[ssize];
  int top;
public:
  Stack() : top(0) {}
  // Copy-constructor copies object into array:
  void push(const T& x) {
    require(top < ssize, "Too many push()es");
    stack[top++] = x;
  }
  T peek() const { return stack[top]; }
  // Object still exists when you pop it; 
  // it just isn't available anymore:
  T pop() {
    require(top > 0, "Too many pop()s");
    return stack[--top];
  }
};
#endif // VALUESTACK_H ///:~

用于被包含对象的构造函数通过按值传递和返回对象来做大部分工作

SelfCounter的类将跟踪对象创建和拷贝构造

//: C16:SelfCounter.h
// From Thinking in C++, 2nd Edition
// Available at http://www.BruceEckel.com
// (c) Bruce Eckel 2000
// Copyright notice in Copyright.txt
#ifndef SELFCOUNTER_H
#define SELFCOUNTER_H
#include "ValueStack.h"
#include <iostream>

class SelfCounter {
  static int counter;
  int id;
public:
  SelfCounter() : id(counter++) {
    std::cout << "Created: " << id << std::endl;
  }
  SelfCounter(const SelfCounter& rv) : id(rv.id){
    std::cout << "Copied: " << id << std::endl;
  }
  SelfCounter operator=(const SelfCounter& rv) {
    std::cout << "Assigned " << rv.id << " to " 
              << id << std::endl;
    return *this;
  }
  ~SelfCounter() {
    std::cout << "Destroyed: "<< id << std::endl;
  }
  friend std::ostream& operator<<( 
    std::ostream& os, const SelfCounter& sc){
    return os << "SelfCounter: " << sc.id;
  }
};
#endif // SELFCOUNTER_H ///:~
//: C16:SelfCounter.cpp {O}
// From Thinking in C++, 2nd Edition
// Available at http://www.BruceEckel.com
// (c) Bruce Eckel 2000
// Copyright notice in Copyright.txt
#include "SelfCounter.h"
int SelfCounter::counter = 0; ///:~
//: C16:ValueStackTest.cpp
// From Thinking in C++, 2nd Edition
// Available at http://www.BruceEckel.com
// (c) Bruce Eckel 2000
// Copyright notice in Copyright.txt
//{L} SelfCounter
#include "ValueStack.h"
#include "SelfCounter.h"
#include <iostream>
using namespace std;

int main() {
  Stack<SelfCounter> sc;
  for(int i = 0; i < 10; i++)
    sc.push(SelfCounter());
  // OK to peek(), result is a temporary:
  cout << sc.peek() << endl;
  for(int k = 0; k < 10; k++)
    cout << sc.pop() << endl;
  getchar();
} ///:~

当创建一个Stack容器时,对于数组中的每个对象调用被包含对象的默认构造函数

输出
Created: 0
Created: 1
Created: 2
Created: 3
Created: 4
Created: 5
Created: 6
Created: 7
Created: 8
Created: 9
Created: 10
Created: 11
Created: 12
Created: 13
Created: 14
Created: 15
Created: 16
Created: 17
Created: 18
Created: 19
Created: 20
Created: 21
Created: 22
Created: 23
Created: 24
Created: 25
Created: 26
Created: 27
Created: 28
Created: 29
Created: 30
Created: 31
Created: 32
Created: 33
Created: 34
Created: 35
Created: 36
Created: 37
Created: 38
Created: 39
Created: 40
Created: 41
Created: 42
Created: 43
Created: 44
Created: 45
Created: 46
Created: 47
Created: 48
Created: 49
Created: 50
Created: 51
Created: 52
Created: 53
Created: 54
Created: 55
Created: 56
Created: 57
Created: 58
Created: 59
Created: 60
Created: 61
Created: 62
Created: 63
Created: 64
Created: 65
Created: 66
Created: 67
Created: 68
Created: 69
Created: 70
Created: 71
Created: 72
Created: 73
Created: 74
Created: 75
Created: 76
Created: 77
Created: 78
Created: 79
Created: 80
Created: 81
Created: 82
Created: 83
Created: 84
Created: 85
Created: 86
Created: 87
Created: 88
Created: 89
Created: 90
Created: 91
Created: 92
Created: 93
Created: 94
Created: 95
Created: 96
Created: 97
Created: 98
Created: 99
Created: 100
Assigned 100 to 0
Copied: 0
Destroyed: 0
Destroyed: 100
Created: 101
Assigned 101 to 1
Copied: 1
Destroyed: 1
Destroyed: 101
Created: 102
Assigned 102 to 2
Copied: 2
Destroyed: 2
Destroyed: 102
Created: 103
Assigned 103 to 3
Copied: 3
Destroyed: 3
Destroyed: 103
Created: 104
Assigned 104 to 4
Copied: 4
Destroyed: 4
Destroyed: 104
Created: 105
Assigned 105 to 5
Copied: 5
Destroyed: 5
Destroyed: 105
Created: 106
Assigned 106 to 6
Copied: 6
Destroyed: 6
Destroyed: 106
Created: 107
Assigned 107 to 7
Copied: 7
Destroyed: 7
Destroyed: 107
Created: 108
Assigned 108 to 8
Copied: 8
Destroyed: 8
Destroyed: 108
Created: 109
Assigned 109 to 9
Copied: 9
Destroyed: 9
Destroyed: 109
Copied: 10
SelfCounter: 10
Destroyed: 10
Copied: 9
SelfCounter: 9
Destroyed: 9
Copied: 8
SelfCounter: 8
Destroyed: 8
Copied: 7
SelfCounter: 7
Destroyed: 7
Copied: 6
SelfCounter: 6
Destroyed: 6
Copied: 5
SelfCounter: 5
Destroyed: 5
Copied: 4
SelfCounter: 4
Destroyed: 4
Copied: 3
SelfCounter: 3
Destroyed: 3
Copied: 2
SelfCounter: 2
Destroyed: 2
Copied: 1
SelfCounter: 1
Destroyed: 1
Copied: 0
SelfCounter: 0
Destroyed: 0

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值