【问题标题】:C++ Templates the complete guide. Assign operatorC++ 模板完整指南。赋值运算符
【发布时间】:2016-04-21 06:18:29
【问题描述】:

作为本书中的一个例子: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&); 
}; 

这里是赋值运算符的实现:

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() 从该副本中获取元素。

我对这部分感到困惑:

然而,这个堆栈有一个 不同的类型(如果你为两个不同的类实例化一个类模板 类型,你会得到两种不同的类型),所以你只能使用 公共接口。

这是说我只能使用公共接口,还是不允许我使用公共接口? 如果这意味着我不允许使用公共接口,那么什么是 top() 成员函数?这不是公共方法吗?

【问题讨论】:

  • 表示只允许使用公共方法,因为Stack&lt;T&gt;Stack&lt;T2&gt;是不同的类型,所以不能在Stack&lt;T&gt;的方法中调用Stack&lt;T2&gt;的非公共方法。

标签: c++ templates operator-keyword assign


【解决方案1】:

Stack&lt;T&gt;Stack&lt;T2&gt; 是不相关的类型如果T != T2, 所以Stack&lt;T&gt;的方法不能使用Stack&lt;T2&gt;的私有成员(除非声明为friend)。

Stack&lt;T&gt;(与任何其他类一样)仅限使用Stack&lt;T2&gt; 的公共接口。

【讨论】:

    【解决方案2】:

    但是,这个堆栈有不同的类型(如果你为两种不同的类型实例化一个类模板,你会得到两种不同的类型),所以你只能使用公共接口。

    这意味着您应该只使用公共接口。事实上,如果你想实现 operator= 函数,那么你必须只使用 public 接口。

    如果您不使用公共接口,您将无法访问 top() 函数,这是您将堆栈的元素分配给另一个堆栈的唯一方法。

    是的,top() 是一个公共函数

    【讨论】:

    • 感谢您的回答。我很困惑,因为在翻译的书中它确切地说你不能使用公共接口,这就是我如此困惑的原因。也感谢宋元瑶
    猜你喜欢
    • 1970-01-01
    • 2010-10-14
    • 2019-06-30
    • 2016-05-18
    • 2015-01-27
    • 2011-11-14
    • 2020-02-28
    • 2011-05-23
    相关资源
    最近更新 更多