鱼C论坛

 找回密码
 立即注册
查看: 2828|回复: 13

[已解决]c++ 智能指针 和模板的应用,小白看不懂,求助求助!

[复制链接]
发表于 2022-4-15 20:10:31 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 香喷喷的咸鱼 于 2022-4-15 20:24 编辑
template<typename MessageT, typename AllocatorT, typename PublisherT>
std::shared_ptr<PublisherT>
Node::create_publisher(
  const std::string & topic_name,
  const rclcpp::QoS & qos,
  const PublisherOptionsWithAllocator<AllocatorT> & options)
{
  return rclcpp::create_publisher<MessageT, AllocatorT, PublisherT>(
    *this,
    extend_name_with_sub_namespace(topic_name, this->get_sub_namespace()),
    qos,
    options);
}


就是这一段代码有点不懂什么意思:

1.std::shared_ptr<PublisherT> 这部分是一个智能指针,它作为函数模板Node::create_publisher()的类型,具有怎样的意义?

2.const std::string & topic_name  这句话的意思是 :这是一个  不变的std::string类型的指向topic_name的地址   吗?

谢谢热心鱼油的帮助!
最佳答案
2022-4-16 18:57:59
本帖最后由 lhgzbxhz 于 2022-4-18 10:13 编辑

1. 我猜你问的是函数返回一个shared_ptr<xxx>的意义?函数尽量返回一个智能指针而非裸指针的意义可参见《Effective C++》条款13,而shared_ptr的意义还在《Effective Modern C++》条款19中有所补充。
简单来说,shared_ptr代表共享资源所有权,当你想要共享资源的所有权时就用(但为了避免开销过大,还是尽量返回unique_ptr,况且客户可以方便地把unique_ptr转换为shared_ptr。)
2. 这是一个天坑……你暂时可以这么理解:
void f1(std::string& s);
void f2(const std::string& s);
void f3(std::string s)

int main()
{
    f1("abc"); // 不行
    f2("abc"); // 可以
    f3("abc"); // 可以,但是有一次复制开销
}
像上述代码中f3那样传值,一般会有复制对象的开销(假设编译器不优化),所以一般会像f2, f1那样引用传参。
为什么上述代码中对f1的调用无法通过编译,而对f2的调用可以呢?因为参数"abc"实际上是通过const char*构造的一个std::string临时对象,而f1的参数类型为std::string&,这暗示了可以在f1函数内修改这一参数。(不管实际上有没有修改)而修改一个临时变量是不允许的,所以编译器拒绝了这种调用。
解决的方法就是像f2那样用const std::string&,主动告诉编译器:“我们不打算修改s参数”,编译便可以通过了。
但是:以上说的仅仅是C++98时代的内容,C++11加入了右值引用,并由此实现了移动语义完美转发,上述写法一般被认为“过时了”。如果你想深入了解的话,《More Effective C++》有整整一章(条款23~30)是讲这个的,建议去看看。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-4-15 22:00:41 | 显示全部楼层

回帖奖励 +1 鱼币

问题 1: 不是很明白。具有怎样的意义?是指智能指针有什么意义吗?
问题 2:const std::string & topic_name 其构造为:const 数据类型 & 标识符(这里的 & 符是引用的意思)用于避免深拷贝,又不想改变原本的值。

评分

参与人数 1鱼币 +1 收起 理由
香喷喷的咸鱼 + 1

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2022-4-16 07:59:55 | 显示全部楼层

回帖奖励 +1 鱼币

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-4-16 08:29:52 | 显示全部楼层

回帖奖励 +1 鱼币

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-4-16 09:59:52 | 显示全部楼层

回帖奖励 +1 鱼币

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-4-16 13:46:08 | 显示全部楼层

回帖奖励 +1 鱼币

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-4-16 13:55:42 | 显示全部楼层

回帖奖励 +1 鱼币

666
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-4-16 15:47:21 | 显示全部楼层

回帖奖励 +1 鱼币

std::shared_ptr<PublisherT>  Node::create_publisher(const std::string & topic_name,const rclcpp::QoS & qos,const PublisherOptionsWithAllocator<AllocatorT> & options)
{};
下次这样放可能好看一点
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-16 18:57:59 | 显示全部楼层    本楼为最佳答案   

回帖奖励 +1 鱼币

本帖最后由 lhgzbxhz 于 2022-4-18 10:13 编辑

1. 我猜你问的是函数返回一个shared_ptr<xxx>的意义?函数尽量返回一个智能指针而非裸指针的意义可参见《Effective C++》条款13,而shared_ptr的意义还在《Effective Modern C++》条款19中有所补充。
简单来说,shared_ptr代表共享资源所有权,当你想要共享资源的所有权时就用(但为了避免开销过大,还是尽量返回unique_ptr,况且客户可以方便地把unique_ptr转换为shared_ptr。)
2. 这是一个天坑……你暂时可以这么理解:
void f1(std::string& s);
void f2(const std::string& s);
void f3(std::string s)

int main()
{
    f1("abc"); // 不行
    f2("abc"); // 可以
    f3("abc"); // 可以,但是有一次复制开销
}
像上述代码中f3那样传值,一般会有复制对象的开销(假设编译器不优化),所以一般会像f2, f1那样引用传参。
为什么上述代码中对f1的调用无法通过编译,而对f2的调用可以呢?因为参数"abc"实际上是通过const char*构造的一个std::string临时对象,而f1的参数类型为std::string&,这暗示了可以在f1函数内修改这一参数。(不管实际上有没有修改)而修改一个临时变量是不允许的,所以编译器拒绝了这种调用。
解决的方法就是像f2那样用const std::string&,主动告诉编译器:“我们不打算修改s参数”,编译便可以通过了。
但是:以上说的仅仅是C++98时代的内容,C++11加入了右值引用,并由此实现了移动语义完美转发,上述写法一般被认为“过时了”。如果你想深入了解的话,《More Effective C++》有整整一章(条款23~30)是讲这个的,建议去看看。

评分

参与人数 1鱼币 +3 收起 理由
香喷喷的咸鱼 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-16 20:49:43 | 显示全部楼层

回帖奖励 +1 鱼币

加油
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-4-16 21:10:06 | 显示全部楼层

回帖奖励 +1 鱼币

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-4-18 10:02:30 | 显示全部楼层
想入门的新人 发表于 2022-4-16 15:47
std::shared_ptr  Node::create_publisher(const std::string & topic_name,const rclcpp::QoS & qos,const ...

好的,明白了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-4-18 10:04:37 | 显示全部楼层
lhgzbxhz 发表于 2022-4-16 18:57
1. 我猜你问的是函数返回一个shared_ptr的意义?函数尽量返回一个智能指针而非裸指针的意义可参见《Effecti ...

感谢回复
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-4-18 11:38:18 | 显示全部楼层
傻眼貓咪 发表于 2022-4-15 22:00
问题 1: 不是很明白。具有怎样的意义?是指智能指针有什么意义吗?
问题 2:const s ...

1.我是想问这一段最后   ,返回的是不是std::shared_ptr<PublisherT>  这个类型的地址。我的表述有问题,不好意思
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-5 20:27

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表