//: C08:StringStack.cpp
// From Thinking in C++, 2nd Edition
// Available at http://www.BruceEckel.com
// (c) Bruce Eckel 2000
// Copyright notice in Copyright.txt
// Using static const to create a
// compile-time constant inside a class
#include <string>
#include <iostream>
using namespace std;class StringStack
{
/* L'istruzione seguente definisce un attributo della classe 'StringStack' che condivide con tutti gli oggetti di tipo 'StringStack' la stessa istanza (valore) della variabile 'size'. 'Const' è necessario poiché, per quanto sopra, se venisse modificato l'attributo 'size' di un oggetto, tutti gli altri oggetti dello stesso tipo avrebbero l'attributo 'size' modificato.*/static const int size = 100;
const string* stack[size];
int index;
public:
StringStack();
void push(const string* s);
const string* pop();};
/* L'istruzione sotto, associa all'attributo 'index' dell'oggetto creato dal costruttore il valore 0.*/
StringStack::StringStack() : index(0)
{
memset(stack, 0, size * sizeof(string*));
}
void StringStack::push(const string* s)
{
if(index < size)
stack[index++] = s;}
const string* StringStack::pop()
{
if(index > 0)
{
const string* rv = stack[--index];
stack[index] = 0;
return rv;}
return 0;
}
string iceCream[] = {
"pralines & cream",
"fudge ripple",
"jamocha almond fudge",
"wild mountain blackberry",
"raspberry sorbet",
"lemon swirl",
"rocky road",
"deep chocolate fudge"
};const int iCsz =
sizeof iceCream / sizeof *iceCream;int main()
{
StringStack ss;
for(int i = 0; i < iCsz; i++)
ss.push(&iceCream[i]);
const string* cp;
while((cp = ss.pop()) != 0)
cout << *cp << endl;} ///:~