gpt4 book ai didi

在另一个类中使用抽象类对象的 C++ 设计模式

转载 作者:行者123 更新时间:2023-11-30 04:33:54 26 4
gpt4 key购买 nike

我有一个带有 2 个纯虚方法的类和另一个需要使用此类对象的类。我想允许此类的用户指定应在其中使用抽象类的哪个派生。我正在努力找出正确的方法。

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 的方法,它应该发挥最大的优势。

最佳答案

我会说,将 abstract 对象传递给用户的构造函数是正确的方法,因为用户的方法依赖于对同一 abstract 对象的调用。我什至会更进一步,使 x 参数成为用户的内部状态,因为您已经说过,这个值是从第一个函数调用返回的值很重要。

更新:如果您担心生命周期,那么您可以使用例如 boost 中可用的各种智能指针选项。这些应该涵盖大多数使用场景。

关于在另一个类中使用抽象类对象的 C++ 设计模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6327030/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com