Тема: Стек, що містить різні типи.
У мене проблема:
Треба створити стек, який працював би з різними стандартними типами.
Моє рішення:
дописати двух child'ів, які мають одне поле відповідного типу, є дружніми у відношенні до класу Stack(щоб все, що належить класам Char та Float, було 'private').
створити масив вказівників на Stack у цьому ж класі.
коли треба додати елемент, проблем не виникає: просто перевантажуємо функцію push за аргументами. Одна робить потрібний елемент массиву типу Stack вказівником на тип Float/Char(бо вони нащадки). Інша - на Char/Float.
я створив віртуальну ффункцію pop. Одноіменна є також і в флоата/чара. Ці функції повертають значення типу флоат та чар відповідно. Отже, судячи з усього, нам навіть не важливо, що робить функція pop у базовому класі, оскільки вона має "пропускатися". Ношотонето.
Ось код:
class Stack {
protected:
static const int SZ = 100;
Stack* mas[100];
int top;
public:
Stack(): top(0) { }
void push(float);
void push(char);
virtual float pop() { return mas[top--]->pop(); }
int gettop() { return top; }
};
class Float:public Stack { float numb; friend Stack; Float(float x): numb(x) { } float pop() { return numb; } };
class Char:public Stack { char symb; friend Stack; Char(char s): symb(s) { } float pop() { return symb; } };
void Stack::push(float n) { mas[top++] = new Float(n); }
void Stack::push(char s) { mas[top++] = new Char(s); }