我有一個具有2個純虛擬方法的類和需要使用此類對象的另一個類。我想讓這個類的用戶指定應該在哪個派生類中使用抽象類。 我正在努力弄清楚正確的方法。在另一個類中使用抽象類對象的C++設計模式
struct abstract {
virtual int fst_func() = 0;
virtual void sec_func(int) = 0;
};
// store an instance of "abstract".
class user_of_abstract
{
private:
abstract* m_abstract;
public:
// Pass a pointer to an "abstract" object. The caller takes care of the memory resource.
user_of_abstract_base(abstract* a) : m_abstract(a) { }
// Pase any type, which needs to be derived from "abstract" and create a copy. Free memory in destructor.
template<class abstract_type>
user_of_abstract_base(abstract_type const& a) : m_abstract(new abstract_type(a)) { }
// use the stored member to call fst_func.
int use_fst_func() {
return this->m_abstract->fst_func();
}
// use the stored member to call sec_func.
void use_sec_func(int x) {
this->m_abstract->sec_func(x);
}
};
// use boost::shared_ptr
class user_of_abstract
{
private:
boost::shared_ptr<abstract> m_abstract;
public:
// Pass a pointer to an "abstract" object. The caller takes care of the memory resource.
user_of_abstract_base(boost::shared_ptr<abstract> a) : m_abstract(a) { }
// use the stored member to call fst_func.
int use_fst_func() {
return this->m_abstract->fst_func();
}
// use the stored member to call sec_func.
void use_sec_func(int x) {
this->m_abstract->sec_func(x);
}
};
// pass a pointer of an "abstract" object wherever needed.
struct user_of_abstract
{
// use the passed pointer to an "abstract" object to call fst_func.
int use_fst_func(abstract* a) {
return a->fst_func();
}
// use the passed pointer to an "abstract" object to call sec_func.
void use_sec_func(abstract* a, int x) {
a->sec_func(x);
}
};
要注意從sec_func該參數的「X」()是很重要的必須是同一個「抽象」的實例()由fst_func返回的值。
編輯: 增加了另一種方法使用boost :: shared_ptr應該採取最大的優勢。
我認爲你的第二類的名字應該是'user_of_abstract_base'。 – 2011-06-13 05:50:42
不要忘了你需要一個虛擬的析構函數來抽象! – 2011-06-13 05:56:20
@Billy |是的,謝謝你的提示。我已經縮短了相關部分的代碼。 – 0xbadf00d 2011-06-13 06:06:43