繁体   English   中英

类中的C ++ typedef

[英]C++ typedef in a class

我使用此C ++代码将x存储到变量val。

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) { }
};

此代码如何工作?

可以写成

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会更干净。

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

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

您派生的auto_ptr<T>基类是类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:只要您没有看到unique_ptr<> auto_ptr<>就很好。 auto_ptr<>的“坏家伙”是复制构造函数。 当心C ++ 0x ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM