作为本书中的一个例子:http://www.amazon.com/C-Templates-The-Complete-Guide/dp/0201734842他们有这个课程:
template <typename T>
class Stack {
private:
std::deque<T> elems; // elements
public:
void push(T const&); // push element
void pop(); // pop element
T top() const; // return top element
bool empty() const { // return whether the stack is empty
return elems.empty();
}
// assign stack of elements of type T2
template <typename T2>
Stack<T>& operator= (Stack<T2> const&);
};
这是assign运算符的实现:
template <typename T>
template <typename T2>
Stack<T>& Stack<T>::operator= (Stack<T2> const& op2)
{
if ((void*)this == (void*)&op2) { // assignment to itself?
return *this;
}
Stack<T2> tmp(op2); // create a copy of the assigned stack
elems.clear(); // remove existing elements
while (!tmp.empty()) { // copy all elements
elems.push_front(tmp.top());
tmp.pop();
}
return *this;
}
以下是对该方法的作用的一些解释:
在成员函数中,您可能希望只访问所有 分配的堆栈op2的必要数据。但是,这个堆栈有一个 不同的类型(如果您实例化两个不同的类模板 类型,你有两种不同的类型),所以你只能使用 公共界面。它遵循唯一的方式来访问 元素是通过调用top()。但是,每个元素都必须成为一个 顶部元素,然后。因此,必须首先制作op2的副本,以便 通过调用pop()来从该副本中获取元素。
我对这部分感到困惑:
然而,这个堆栈有一个 不同的类型(如果您实例化两个不同的类模板 类型,你有两种不同的类型),所以你只能使用 公共界面。
这是否说我只允许使用公共接口,或者我不允许使用公共接口? 如果这意味着我不允许使用公共interfases,而不是top()成员函数?这不是一种公共方法吗?
答案 0 :(得分:3)
Stack<T>
, Stack<T2>
和T != T2
是不相关的类型,
因此Stack<T>
的方法无法使用Stack<T2>
的私有成员(除非声明为friend
)。
Stack<T>
(与任何其他类一样)仅限于使用Stack<T2>
的公共接口。
答案 1 :(得分:1)
但是,此堆栈具有不同的类型(如果您为两种不同的类型实例化一个类模板,则会获得两种不同的类型),因此您只能使用公共接口。
这意味着您应该只使用公共接口。事实上,如果你想实现operator = function,那么必须只使用公共接口。
如果您不使用公共接口,您将无法访问top()函数,这是您可以将堆栈元素分配给另一个堆栈的唯一方法。
是的, top()是公共功能。