C++(和 ROS)- 包含与前向声明引用与设置默认值和 typedef
C++ (and ROS) - Include vs. forward declare of reference with set default and typedef
关于前向声明,我有两个非常相关的问题,它们的优点和与 #include
的区别。在阅读了它们之后,我仍然不清楚是否:
使用 ROS 消息中的 ConstPtr(如 this)算作一个指针,可以(以某种方式)向前声明,或者需要一个 #include
;
void foo(const Eigen::Vector3d& scale={0.001, 0.001, 0.001});
在 .h 文件中可以使用类似的东西(但这实际上并不能编译)
namespace Eigen
{
class Vector3d;
}
在所有其他 #include
之后的 .h 顶部,或者如果我应该使用正确的 header。
需要明确的是,第二个问题是 scale
有一个默认值,这实际上是我将在 .cpp 中始终使用的值。这是我使用 Vector3d 的唯一实例。
我也很确定前向声明是否足够,因此我也不需要在 .cpp 中包含正确的 header,因为我只在方法。
X
的前向声明足以使用 X*
或 X&
作为函数参数或 class 成员,因为 [=不需要 17=] 就可以使用它的地址。
但是为了创建 class 的对象,即使是具有默认值的对象,您也需要它的定义。
关于前向声明,我有两个非常相关的问题,它们的优点和与 #include
的区别。在阅读了它们之后,我仍然不清楚是否:
使用 ROS 消息中的 ConstPtr(如 this)算作一个指针,可以(以某种方式)向前声明,或者需要一个
#include
;void foo(const Eigen::Vector3d& scale={0.001, 0.001, 0.001});
在 .h 文件中可以使用类似的东西(但这实际上并不能编译)namespace Eigen { class Vector3d; }
在所有其他 #include
之后的 .h 顶部,或者如果我应该使用正确的 header。
需要明确的是,第二个问题是 scale
有一个默认值,这实际上是我将在 .cpp 中始终使用的值。这是我使用 Vector3d 的唯一实例。
我也很确定前向声明是否足够,因此我也不需要在 .cpp 中包含正确的 header,因为我只在方法。
X
的前向声明足以使用 X*
或 X&
作为函数参数或 class 成员,因为 [=不需要 17=] 就可以使用它的地址。
但是为了创建 class 的对象,即使是具有默认值的对象,您也需要它的定义。