Meyers在条款7中给出了一个用于实现 "class 专属的new-handlers ",用class X实现了一个
用template和inheritance实现了一个,在template版本中,Meyers解释说:
之所以使用inheritance是为了使derived class 也具有这种能力(class 专属的new-handlers)。
而之所以使用template,是因为确保每一份derived class拥有一个不同的currentHandler data
member,(侯捷解释:因为它(变量 currentHandler)是一个static data member,所以才需要
这项特别技术),请教侯捷为什么做出这样的解释?
位置:effective c++ 第二版,p31,右下一段!
==========================
基类的静态成员是唯一的,如果不用模板,所有从NewHandlerSupport继承的类的currentHandler都一样,你在一个派生类里set_new_handler之后,其他派生类的currentHandler就不能用了。
而以派生类类型为参数的模板基类,每个派生类的基类其实都不一样,其静态成员就是每个派生类自已有一个了。
比如说
class B{public static int a;};
int B::a;
class D1 : public B{};
class D2 : public B{};
...
D1 x; D2 y;
x.a = 1;
assert(y.a == 1);
如上,D1和D2的a是相同的。而
template <typename T> class B{public static int a;};
template <typename T> int B <T> ::a;
class D1 : public B <D1> {};
class D2 : public B <D2> {};
...
D1 x; D2 y;
x.a = 1;
y.a = 2;
assert(x.a == 1);
assert(y.a == 2);
D1和D2有不同的a。
用template和inheritance实现了一个,在template版本中,Meyers解释说:
之所以使用inheritance是为了使derived class 也具有这种能力(class 专属的new-handlers)。
而之所以使用template,是因为确保每一份derived class拥有一个不同的currentHandler data
member,(侯捷解释:因为它(变量 currentHandler)是一个static data member,所以才需要
这项特别技术),请教侯捷为什么做出这样的解释?
位置:effective c++ 第二版,p31,右下一段!
==========================
基类的静态成员是唯一的,如果不用模板,所有从NewHandlerSupport继承的类的currentHandler都一样,你在一个派生类里set_new_handler之后,其他派生类的currentHandler就不能用了。
而以派生类类型为参数的模板基类,每个派生类的基类其实都不一样,其静态成员就是每个派生类自已有一个了。
比如说
class B{public static int a;};
int B::a;
class D1 : public B{};
class D2 : public B{};
...
D1 x; D2 y;
x.a = 1;
assert(y.a == 1);
如上,D1和D2的a是相同的。而
template <typename T> class B{public static int a;};
template <typename T> int B <T> ::a;
class D1 : public B <D1> {};
class D2 : public B <D2> {};
...
D1 x; D2 y;
x.a = 1;
y.a = 2;
assert(x.a == 1);
assert(y.a == 2);
D1和D2有不同的a。