C++ C++;模板是完整的指南。指派操作员
本书中的一个例子是:他们有这样一个类:C++ C++;模板是完整的指南。指派操作员,c++,templates,operator-keyword,assign,C++,Templates,Operator Keyword,Assign,本书中的一个例子是:他们有这样一个类: 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() con
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&);
};
模板
类堆栈{
私人:
std::deque elems;//元素
公众:
void push(T const&);//push元素
void pop();//pop元素
T top()const;//返回top元素
bool empty()常量{//返回堆栈是否为空
返回elems.empty();
}
//分配T2类型元素的堆栈
模板
堆栈和运算符=(堆栈常量&);
};
下面是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)
{
如果((void*)this==(void*)&op2){//分配给自身?
归还*这个;
}
堆栈tmp(op2);//创建指定堆栈的副本
elems.clear();//删除现有元素
而(!tmp.empty()){//复制所有元素
元素向前推(tmp.top());
tmp.pop();
}
归还*这个;
}
下面是关于该方法的一些解释:
在成员函数中,您可能只希望访问所有
指定堆栈op2的必要数据。但是,此堆栈具有
不同类型(如果您为两个不同的
类型,您会得到两种不同的类型),因此您只能使用
公共界面。因此,访问
元素是通过调用top()实现的。但是,每个元素都必须成为一个
那就上元素吧。因此,必须首先制作op2的副本,以便
通过调用pop()从该副本获取元素
我对这部分感到困惑:
但是,此堆栈具有
不同类型(如果您为两个不同的
类型,您会得到两种不同的类型),因此您只能使用
公共界面
这是说我只能使用公共接口,还是不允许使用公共接口?
如果这意味着不允许我使用public interface,那么什么是top()成员函数?这不是一种公共方法吗
但是,该堆栈具有不同的类型(如果为两种不同的类型实例化一个类模板,则会得到两种不同的类型),因此只能使用公共接口
这意味着您应该只使用公共接口。事实上,如果要实现operator=函数,则必须只使用public接口
如果不使用公共接口,则无法访问top()函数,这是将堆栈的元素分配给另一个堆栈的唯一方法
是的,top()是一个公共函数
但是,该堆栈具有不同的类型(如果为两种不同的类型实例化一个类模板,则会得到两种不同的类型),因此只能使用公共接口
这意味着您应该只使用公共接口。事实上,如果要实现operator=函数,则必须只使用public接口
如果不使用公共接口,则无法访问top()函数,这是将堆栈的元素分配给另一个堆栈的唯一方法
是的,top()是一个公共函数堆栈
,如果T!=T2
,
因此,Stack
的方法不能使用Stack
的私有成员(除非声明为friend
)
Stack
(与任何其他类一样)仅限于使用Stack
Stack
的公共接口,如果T!=T2
,
因此,Stack
的方法不能使用Stack
的私有成员(除非声明为friend
)
Stack
(与任何其他类一样)仅限于使用Stack
的公共接口,更适合它意味着只允许使用公共方法,因为Stack
和Stack
是不同的类型,所以不能在Stack
的方法中调用Stack
的非公共方法。更适合它意味着只允许使用公共方法,因为Stack
和Stack
是不同的类型,所以不能在Stack
的方法中调用Stack
的非公共方法。谢谢你的回答。我很困惑,因为在一本翻译的书中,它确切地说你们不能使用公共干涉,这就是为什么我如此困惑的原因。也谢谢宋元耀谢谢你的回答。我很困惑,因为在一本翻译的书中,它确切地说你们不能使用公共干涉,这就是为什么我如此困惑的原因。也感谢宋元耀