[英]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.