//: 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;

} ///:~