Вот интерфейс
template <class Type>
class stackADT
{
public:
virtual void initializeStack() = 0;
virtual bool isEmptyStack() const = 0;
virtual bool isFullStack() const = 0;
virtual void push(const Type& newItem) = 0;
virtual Type top() const = 0;
virtual void pop() = 0;
virtual void reverseStack(stackType<Type>& otherStack) = 0;
private:
int maxStackSize;
int stackTop;
Type *list;
};
Вот метод обратного стека, который является частью класса stackType, который расширяет stackADT
template <class Type>
class stackType : public stackADT<Type>
{
private:
int maxStackSize;
int stackTop;
Type *list;
public:
/***
Other methods ...
**/
void reverseStack(stackType<Type>& otherStack)
{
int count = 0;
otherStack.list = new Type[maxStackSize]; // why does this WORK!!! its private
otherStack.stackTop = 0; // why does this WORK!!! its private
//copy otherStack into this stack.
for (int j = stackTop - 1; j >= 0; j--)
{
otherStack.push(list[j]);
count++;
}
}
Вот основной цикл с вызовами.
stackType<int> stack1(50);
stackType<int> stack2(50);
stack1.initializeStack();
stack1.push(1);
stack1.push(2);
stack1.push(3);
stack1.push(4);
stack1.push(5);
stack1.reverseStack(stack2);
Так что то, что происходит с этим в C ++, потому что в Java, PHP, Python (искаженное именование) и другие OOD не позволило бы этого.
Я думаю, вы не понимаете, что на самом деле делает private, потому что это также будет работать в Java.
Приватный означает, что экземпляры других классов (или не имеющие классов, то есть функций) не могут изменить / вызвать / вызвать / … этот член / метод. Важной частью здесь является то, что это говорит другие классы. Экземпляры одного и того же класса могут изменять / вызывать / вызывать / … закрытые члены / методы.
Как показано, он не будет компилироваться.
Дело в том, что функция reverseStack
должен быть член метод, поэтому он должен начинаться с:
void stackADT::reverseStack(stackType<Type>& otherStack)
Как метод-член, он имеет доступ к private
переменные.