Автор книги имеет в виду, что класс StackOfInt не должен содержать никаких других членов, кроме указателя на класс реализации.Необходимые члены данных, будь то переменная массива + счетчика или вектор, должны быть членами класса реализации.
Таким образом, в заголовке у вас будет
class StackOfInt {
class StackImp;
StackImp* impl;
public:
void initialize();
void push(int dat);
int peek();
int pop();
void cleanup();
};
.В файле реализации у вас будет реализация:
class StackOfInt::StackImp
{
public:
int count;
int array[100];
};
void StackOfInt::initialize()
{
impl = new StackImp;
impl->count = 0;
}
void StackOfInt::push(int dat)
{
impl->array[impl->count++] = dat;
}
//and other methods
Напишите другой файл cpp, который использует класс StackOfImp.Скомпилируйте проект и запустите программу, чтобы убедиться, что все работает хорошо:)
Теперь вы можете полностью переписать файл реализации для StackOfInt, чтобы использовать вектор в качестве базового типа.Перекомпилируйте проект.Обратите внимание, что пользователь StackOfImp (тестовый код) не должен быть перекомпилирован, потому что ничего не изменилось в заголовке .
Чтобы узнать больше о методике, которую автор называет "Чеширский кот"": Непрозрачный указатель
Обратите внимание, что я не понимаю вашего использования пустого указателя.StackOfInt должен принимать и возвращать целые числа.
Вызов указателя реализации head
также указывает на некоторое недопонимание.Это представляет указатель на объект, который фактически будет содержать необходимые члены для реализации стека.