c++ - 如果允许堆栈分配的引用作为参数,如何进行通信?

标签 c++ design-patterns documentation code-documentation

我正在寻找一种标准方法来告诉 C++ API 的用户构造函数(或方法)是否接受分配在堆栈上的对象作为有效参数。是否有一种模式(例如,特殊的构造函数/方法签名)告诉这里没有堆栈对象/这里没有堆栈对象?如果在没有另外记录的情况下允许堆栈对象,是否存在默认假设的常识?

问题说明:当类 Vector6D 具有构造函数 Vector6D(const Vector3D& upper, const Vector3D& lower) 时,至少有两种方法可以实现该类:

a) 在构造函数中复制两个 vector 的元素并忘记 Vector3D 实例。

b) 聚合 Vector6D 中的 Vector3D 实例,并继续使用后续方法调用的引用。

对于 a) Vector3D 实例分配在哪里并不重要。对于 b),如果 Vector3D 实例分配在堆栈上,则当堆栈帧消失时,实现将停止工作。

因此,如果不查看实现或文档,用户就无法决定要做什么。

编辑:上下文是一个嵌入式软件项目,不允许我使用 STL、异常、提升等。

最佳答案

C++ 中没有机制强制构造函数(或其他可变成员方法)参数的生命周期超过对象的生命周期。

只有堆分配对象的所有权,通过std::unique_ptr<T>保存和传递, std::shared_ptr<T> ,或类似的,可以干净地表达和转移。

具有临时约定、编译器未强制执行、暗示参数存储为引用的类设计将被视为糟糕的类。

您应该考虑以下一般准则:

  • 廉价复制的类型应该被复制。
  • 不可复制的类型应该通过智能指针进行堆分配和传递/拥有。
  • 如果类型需要与具有独立生命周期的其他对象持久共享,则被认为“太昂贵”而无法复制的类型也应该分配智能指针。

当生命周期不是由 API 用户任意控制时,此堆分配策略有异常(exception),但在您上面描述的情况下则不然。

关于c++ - 如果允许堆栈分配的引用作为参数,如何进行通信?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25651245/

相关文章:

documentation - 在用户手册中使用单词 "you"

c# - 什么是实现缓存备用模式的好方法?

linux - 是否有适用于 Mac OS 和 Linux 的 MSDN 等效项?

c++ - 带有数字问题的自然排序文件名 C++

c++ - 霍夫曼代码 - 段错误 11

c++ - UDP 客户端/服务器发送数据但无法读取

c++ - 在 C++ 作业问题中测试字符串输入时无法退出 while 循环(作为数据验证)

c# - 依赖容器 : how to instantiate object instances

iOS/Cocoa - 数据模型 <-> Controller 的设计模式

ruby - 可以通过命令行访问的多行用法记录 Rake 任务吗?