2017-10-16 119 views
-1

这里是接口C++私有变量范围的规则

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原因就不允许这样做。

+0

*不会允许这个* - 你能更具体地说明这是什么吗?你的代码也声明'stackADT',但使用'stackType'。这是什么? –

+0

我说这就是接口, 模板 类stackType:公共stackADT { 私人...... 它延伸 – c3cris

+0

我明白了。发布SSCCE(http://sscce.org)是一个不错的主意,以便我们掌握整个情况。就目前而言,你的问题并没有描述'stackADT'和'stackType'之间的关系,这使得它变得混乱。 –

回答

1

我想你很困惑私人实际上做了什么,因为这也可以在Java中工作。

私有意味着其他类(或没有类,意思是函数)的实例不能改变/调用/调用/ ...该成员/方法。这里的重要部分是它说其他类。同一个类的实例可以改变/调用/调用/ ...私有成员/方法。

+0

https://pastebin.com/jADSgXZv 我试了一下,你是正确的 – c3cris

+0

所以任何其他类的实例可以调用其他实例的私有方法或变量? – c3cris

+0

@ c3cris正确 – Brotcrunsher

0

如图所示,它不会编译。

的一点是,该函数reverseStack应该是一个构件方法来代替,所以它应该开始:
void stackADT::reverseStack(stackType<Type>& otherStack)
作为会员的方法,它可以访问private变量。