ATL布幔之下的秘密(3)
2006-07-22 22:54:58 来源:WEB开发网核心提示: 程序的输出为:Round1::PlayRound2::PlayATL就是使用Strategy设计模式来实现线程的,代理设计模式也可以使用模板实现,ATL布幔之下的秘密(3)(8),智能指针就是一个例子,下面就是一个没有使用模板的简单版本智能指针,程序47.#include <iost
程序的输出为:
Round1::Play
Round2::Play
ATL就是使用Strategy设计模式来实现线程的。
代理设计模式也可以使用模板实现,智能指针就是一个例子。下面就是一个没有使用模板的简单版本智能指针。
程序46.
#include <iostream>
using namespace std;
class Inner {
public:
void Fun() {
cout << "Inner::Fun" << endl;
}
};
class Outer {
private:
Inner* m_pInner;
public:
Outer(Inner* p_pInner) : m_pInner(p_pInner) {
}
Inner* operator -> () {
return m_pInner;
}
};
int main() {
Inner objInner;
Outer objOuter(&objInner);
objOuter->Fun();
return 0;
}
程序的输出为:
Inner::Fun()
简单地说来,我们仅仅重载了->运算符,但是在实际的智能指针中,所有必须的运算符(例如=、==、!、&、*)都需要被重载。以上的智能指针有一个大问题:它只能包含指向Inner对象的指针。我们可以编写Outer类模板来取消这一限制,现在让我们来略微修改一下程序。
程序47.
#include <iostream>
using namespace std;
class Inner {
public:
void Fun() {
cout << "Inner::Fun" << endl;
}
};
template <typename T>
class Outer {
private:
T* m_pInner;
public:
Outer(T* p_pInner) : m_pInner(p_pInner) {
}
T* operator -> () {
return m_pInner;
}
};
int main() {
Inner objInner;
Outer<Inner> objOuter(&objInner);
objOuter->Fun();
return 0;
}
程序的输出和前一个一样,但是现在Outer类就可以包含任何类型了,只需要把类型作为模板参数传递进来即可。
更多精彩
赞助商链接