Je veut que void push(C &i) produit une exception lorsque la pille(pilha) est complet(I=3). Pour ça, j'avais fait la classe Pilha_cheia()(pille pleine).
Quand je éxécute le programme je n'ai pas la message de pille complète et je peut toujours insérer autre élément à la pille.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
#include <iostream>
 
using namespace std;
 
class Par { // classe Par
 
private: 
    double left;
    double right;
 
public:
    Par() {left = 0; right = 0;}
    Par(double l, double r) {left = l; right = r;}
 
    void set_left(double n) {left = n;}
    void set_right(double n) {right = n;}
    double get_left() const {return left;}
    double get_right() const {return right;}
    virtual void print() const {
    	cout << "(" << get_left() << "," << get_right() << ")" << endl;}
};
 
class Ponto: public Par { // subclasse Ponto
 
public:
    Ponto():Par() {};
    Ponto(double x, double y):Par(x,y) {};
 
    void set_abc(int x) {set_left(x);}
    void set_ord(int y) {set_right(y);}
    double get_abc() {return get_left();}
    double get_ord() {return get_right();}
    virtual void print() const {
    	cout << "(" << get_left() << "," << get_right() << ")" << endl;}
};
 
class Materro {
 
public: 
    virtual void printerro() const
        {cerr << "Erro matemático." << endl;}
};
 
class Overflow: public Materro {
 
public:
    Overflow();
    virtual void printerro() const
        {cerr << "Erro de overflow." << endl;}
};
 
class Pilha_cheia: public Materro {
 
public:
    Pilha_cheia();
    virtual void printerro() const
        {cerr << " Pilha cheia. " << endl;}
};
 
template <class C, int I>
 
class Pilha // classe Pilha
{
private:
    typedef struct pilha_node
  { 
  	C elem;
    struct pilha_node * next;
  } Pilha_node, * Pilha_node_ptr;
 
  Pilha_node_ptr pilha;
 
public:
    Pilha() {pilha = NULL; count = 0;}
    int count;
 
    void push(C &i){ // Método que insere um objecto da classe C na pilha
      if (count == I) throw Pilha_cheia();
      else {
      Pilha_node_ptr aux = new Pilha_node;
      aux -> elem = i;
      aux -> next = pilha;
      pilha = aux;
      count++;
      }
      };
 
    virtual C pop() { // Método que devolve o objecto no topo e remove-o da lista
     if (pilha == NULL) {cout << " Pilha vazia " << endl;}
     else {Pilha_node_ptr aux = pilha;
     pilha = pilha -> next;
     delete aux; 
     count--;
     pilha; 
     if (pilha == NULL) {cout << " A pilha ficou vazia. " << endl;}
     }
    }; 
 
    virtual void printpilha() const
     {
     	Pilha_node_ptr aux = pilha;
     	while (aux != NULL)
            {aux -> elem.print();
             aux = aux -> next;}
     };
};
 
int main()
{ 
  int j = 1;
  int k = 1;
  int l = 1;
  double a, b;
  double x, y;
  const int I = 3;
  Pilha<Par, I> pp;
  while (j != 0) {
  	cout << " Escolha se pretende inserir ou retirar um objecto da pilha: " << endl;
  	cout << " 1. Inserir " << endl;
  	cout << " 2. Retirar " << endl;
  	cout << " 0. Saída " << endl;
  	cin >> j;
  	if (j == 1) 
         {cout << " Escolha o tipo de objecto que pretende inserir: " << endl;
  		  cout << " 1. Objecto da classe Par " << endl;
  		  cout << " 2. Objecto da classe Ponto " << endl;
  		  cout << " 0. Saída " << endl;
  		  cin >> k;
  		  switch(k) {
  		  case 1: {cout << " Introduza o elemento da esquerda do par: ";
  		           cin >> a;
  		           cout << " Introduza o elemento da direita do par: ";
  		           cin >> b;
  		           Par p(a,b);
  		           pp.push(p);
  		           pp.printpilha();
  		           cout << " Para continuar carregue numa tecla numérica. ";
  		           cin >> l;
  		           cout << endl;
  		           break;}
        case 2: {cout << " Introduza a abcissa do ponto: ";
  		         cin >> x;
  		         cout << " Introduza a ordenada do ponto: ";
  		         cin >> y;
  		         Ponto p(x,y);
  		         pp.push(p);
  		         pp.printpilha();
  		         cout << " Para continuar carregue numa tecla numérica. ";
  		         cin >> l;
  		         cout << endl;
  		         break;}
  		         j = 0;}
        }
 
 
    if (j == 2) {
    	pp.pop(); 
        pp.printpilha(); 
        cout << " Para continuar carregue numa tecla numérica. ";
        cin >> l;
        cout << endl;}
 
  	if (j == 0) {cout << "------------------------------FIM------------------------------" << endl;}
  };
};
Ça serais à cause de void push? Je ne peut pas appeler Pilha_cheia() dans push?

Merci d'avance.