2011-03-03 65 views
1

我使用这个C++代码将x存储到变量val中。类中的C++ typedef

class Hello 
{ 
    int val; 
public: 
    Hello(int x) : val(x) {} 
}; 

但是,当我看到这段代码时,我看不出Super如何存储值t或o。

template<typename T> 
class K : public std::auto_ptr<T> 
{ 
    typedef std::auto_ptr<T> Super; 
public: 
    K() : Super() { } 
    K(T* t) : Super(t) { } 
    K(K<T>& o) : Super(o) { } 
}; 

此代码是如何工作的?

+0

对混淆部分是什么有点澄清? – 2011-03-03 21:49:18

回答

4

可以一直写为

template<typename T> 
class K : public std::auto_ptr<T> 
{ 
public: 
    K() : std::auto_ptr<T>() { } 
    K(T* t) : std::auto_ptr<T>(t) { } 
    K(K<T>& o) : std::auto_ptr<T>(o) { } 
}; 

这仅仅是更详细的初始化基类。如果您必须处理模板化的基类,那么typedef在大多数情况下都更清晰。

1

typedef typedef std::auto_ptr<T> Super;表示Super是类型为T的auto_ptr。K的空构造函数初始化Super,如果给定类型T的指针,则Super被初始化为管理它的auto_ptr,并且如果对K用类型T给出,然后传递给Super。

2

这是因为类K继承自std::auto_ptr<T>。发生的事情是,构造函数K(T* t)K(K<T>& o)调用父构造函数std::auto_ptr<T>(...),这也归功于typedef,它也被称为Super

1

您从中派生的基类是T的元素的容器。这个基类有(至少)构造函数定义,你在呼唤:

的基类可以这样的(实际上,它不是,但这个构造函数的定义可能会给你一个画面)来定义:

template<typename T> 
class auto_ptr { 
    T* value; 
    public: 
    auto_ptr() : value(NULL) {} 
    auto_ptr(T* t) : value(t) { } 
    auto_ptr(auto_ptr<T>& other) : value(other.value) {} 
}; 

所以,auto_ptr<T>保持一个T类型的值。而这三个定义的构造照顾:

  • 空/标准建设必须从原始指针
  • 建设容器

  • 拷贝左右,然后在你的类讲,你给Super的名称std::auto_ptr<T>,这只是一个缩写来调用相应的基类构造函数。你可以写

    template<typename T> 
    class K : public std::auto_ptr<T> 
    { 
    public: 
        K() : std::auto_ptr<T>() { } 
        K(T* t) : std::auto_ptr<T>(t) { } 
        K(K<T>& o) : std::auto_ptr<T>(o) { } 
    }; 
    

    因为你现在直接调用基类的构造函数。而那些我们之前定义的(和“现实生活”中定义的更有意义,然后我在这里做了)。

    PS:auto_ptr<>只要你还没有看到​​就好了。 auto_ptr<>“坏人”是它的复制构造函数。注意C++ 0x ...