用于抽象基类和派生类的工厂功能的C 返回类型
c++ return types for factory functions for Abstract Base Classes and Derived classes
假设我需要两个工厂用于抽象基类及其派生的类(我无法访问实际的构造函数)。关于效率和代码样式,哪个是最好的结构?
1)让所有工厂返回共享_ptr。这是统一的,但导致许多不必要的共享_ptr用于派生类,因为它们直接在客户端代码中删除。
std::shared_ptr<Derived> createDerived(Argument arg)
{
return std::make_shared<Derived>(arg);
}
std::shared_ptr<AbstractBaseClass> createABC(Argument arg)
{
if (suchAndSo(arg))
return createDerived(arg);
else
return nullptr; // or createSomeOtherDerivedClass
}
int main()
{
Argument Arg;
Derived d = *createDerived(arg);
auto pAbc = createABC(arg);
}
2)让派生类的工厂返回一个值,然后让ABC工厂返回一个共享的PTR,该PTR是通过使用make_shared和派生的复制构造函数构造的(导致许多复制构造函数调用)
Derived createDerived(Argument arg)
{
return Derived(arg);
}
std::shared_ptr<AbstractBaseClass> createABC(Argument arg)
{
if (suchAndSo(arg))
return make_shared<AbstractBaseClass>(createDerived(arg));
else
return nullptr; // or createSomeOtherDerivedClass
}
int main()
{
Argument Arg;
Derived d = createDerived(arg);
auto pAbc = createABC(arg);
}
在ABC情况下,您可以简单地返回unique_ptr
,以避免shared_ptr
的开销。但是,仅当~AbstractBaseClass
是虚拟的时才。
通过返回unique_ptr
,您允许呼叫者决定是否需要共享对象。
返回混凝土类型的对象时,返回值确实是一个绝佳的选择。避免了动态分配的成本。
导致许多复制构造函数
值返回工厂本身仅在对象不可移动时复制,并且当优化器不实现复制elision(任何不错的优化器所使用)时。
您可以在不委派返回工厂的情况下实现抽象指针返回工厂,而是直接构建对象以避免该副本(移动)。
两个出厂功能都应返回简单的指针。共享指针应适用于其结果。
用逻辑术语选择适当的构造函数,与管理对象所有权(通过共享指针)不同。
相关文章:
- 在执行其他功能的同时播放动画(LED矩阵和Arduino/ESP8266)
- 多态性和功能结合
- 带内存和隔离功能的SQLite
- 在CMakeLists.txt的安装功能中使用.cmake文件有什么用
- 类模板的成员功能的定义在单独的TU中完全专业化
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 如何在C++中获得"静态纯虚拟"功能?
- 派生类是否可以在抽象工厂设计模式中具有数据成员
- 两个文件使用彼此的功能-如何解决
- 我应该实现右值推送功能吗?我应该使用std::move吗
- QML按钮点击功能执行顺序
- 无法理解此 return 语句的功能,没有它就会发生运行时错误
- 有没有可能有一个只有ADL才能找到的非好友功能
- 此工厂功能有什么问题?
- 如何编写工厂功能以在C 中初始化constexpr参考
- 实现工厂模式时虚拟功能的多重定义
- 用于抽象基类和派生类的工厂功能的C 返回类型
- 提升::工厂和标准::功能
- C++ & Lua Api,具有工厂功能的就地分配
- 工厂设计模式中的纯虚拟功能错误