当前位置: 首页 > news >正文

网站开发系统毕业综合实践报告wordpress包下载

网站开发系统毕业综合实践报告,wordpress包下载,广州专业做标书公司,小程序建站模板在最近学习cartographer算法的时候#xff0c;发现源码中大量的使用了std::shared_ptr与std::make_unique#xff0c;对于这些东西之前不是很了解#xff0c;为了更好的理解源代码#xff0c;因此简单学习了一下这块内容的使用#xff0c;在这里简单记个笔记。 std::shar…在最近学习cartographer算法的时候发现源码中大量的使用了std::shared_ptr与std::make_unique对于这些东西之前不是很了解为了更好的理解源代码因此简单学习了一下这块内容的使用在这里简单记个笔记。 std::shared_ptr shared_ptr是一种智能指针smart pointer作用有如同指针但会记录有多少个shared_ptrs共同指向一个对象。这便是所谓的引用计数reference counting。 一旦最后一个这样的指针被销毁也就是一旦某个对象的引用计数变为0这个对象会被自动删除。 其创建方式主要包含以下几种 1、空shared_ptr shared_ptr T ptr;2、使用new创建 shared_ptrT ptr(new T());3、使用复制构造函数或者重载构造 shared_ptrT ptr1(new T()); shared_ptrT ptr2(ptr1);示例 shared_ptrint sp(new int(10)); //一个指向整数的shared_ptr assert(sp.unique()); //现在shared_ptr是指针的唯一持有者 shared_ptrint sp2 sp; //第二个shared_ptr,拷贝构造函数 assert(sp sp2 sp.use_count() 2); //两个shared_ptr相等,指向同一个对象,引用计数为2 *sp2 100; //使用解引用操作符修改被指对象 assert(*sp 100); //另一个shared_ptr也同时被修改 sp.reset(); //停止shared_ptr的使用 assert(!sp); 有些东西不是完全理解先放这儿后面看得多了写的多了自然就理解了。 此外与shared_ptr相反的还有unique_ptr它的区别在于unique_ptr实现独占式拥有exclusive ownership或严格拥有strict ownership概念保证同一时间内只有一个智能指针可以指向该对象。它对于避免资源泄露resourece leak——例如“以new创建对象后因为发生异常而忘记调用delete”——特别有用。 std::make_unique std::make_unique 是 C11 标准引入的一个模板函数用于动态分配指定类型的内存并返回一个指向分配内存的唯一指针 (即 std::unique_ptr)。 std::make_unique 的语法如下 templatetypename T, typename... Args std::unique_ptrT make_unique(Args... args);其中T 是指定的类型Args 是可变长模板参数包用于传递给指定类型的构造函数的参数。在调用 std::make_unique 时通过 Args 包传入构造函数的参数会被转发给类型 T 的构造函数以生成相应的对象实例。该函数返回的指针是一个 std::unique_ptr 类型表示一个拥有指向动态内存的所有权的对象。 为了方便理解std::shared_ptr与std::make_unique我们在这里举个例子 例1 #include ros/ros.h #include std_msgs/String.h using namespace std;class A { public://std::shared_ptrB pointer;~A() {std::cout A was destroyed std::endl;}void printdata(){std::cout print A class data std::endl;} };class share_test {public:share_test();ros::Subscriber data_sub;void init();private:std::shared_ptrA a;void dataCallback(const std_msgs::String::ConstPtr msg); }; share_test::share_test() {ros::NodeHandle n;ros::NodeHandle private_nh(~);data_sub n.subscribestd_msgs::String(/data_pub,1,share_test::dataCallback,this); }void share_test::init() {a std::make_uniqueA();//std::shared_ptrA a std::make_sharedA(); }void share_test::dataCallback(const std_msgs::String::ConstPtr msg) {a-printdata(); } int main(int argc, char **argv) {ros::init(argc, argv, share_test); share_test share_test;share_test.init();ros::spin(); return 0; }在上述函数中定义了两个类函数A以及share_test在函数初始化中我们初始化了share_test类同时在share_test中声明了一个shared_ptr指针 std::shared_ptrA a;注意这里创建的是一个空指针上述创建方法中第一种。然后我们在下面的init函数中使用make_unique将其创建为动态分配的智能指针 a std::make_uniqueA();此时原来的空指针就变成了指向类A的智能指针。这里有个问题在《C 的 make_unique》这篇博客中使用 auto a std::make_uniqueA();的方式建立了指向A的智能指针时a的指针类型为unique_ptr但是这里我初始化时将其初始化为shared_ptr似乎也是一样的不是很理解。 在完成这一步之后就有了一个指向class A的智能指针。然后我们就可以调用class A中的相关函数例如这里我们在订阅data_pub的回调函数中引用了A的print函数编译运行后新开一个终端输入 rostopic pub -1 /data_pub std_msgs/String data: SSS就可以在节点这边的终端显示如下输出 可以看到这里打印出了class A中的打印输出。通过这种指针的方式我们可以很容易的引用一些其他类函数进行需求的解算 例2 再看一个新的例子 #include ros/ros.h #include std_msgs/String.h using namespace std;class C { public:double input_1;string input_2;C(double data1,string data2){std::cout data1 is: data1 std::endl;std::cout data2 is: data2 std::endl;input_1 data1;input_2 data2;}void printdata(){std::cout print C class data std::endl;std::cout input_1 is: input_1 std::endl;std::cout input_2 is: input_2 std::endl;}~C() {std::cout C was destroyed std::endl;} };class share_test {public:share_test();ros::Subscriber data_sub;void init();private:std::shared_ptrC c;std::shared_ptrC c2;void dataCallback(const std_msgs::String::ConstPtr msg); }; share_test::share_test() {ros::NodeHandle n;ros::NodeHandle private_nh(~);data_sub n.subscribestd_msgs::String(/data_pub,1,share_test::dataCallback,this); }void share_test::init() {c std::make_uniqueC(1,abc);c2 std::make_uniqueC(2,abcd);//std::shared_ptrA a std::make_sharedA(); }void share_test::dataCallback(const std_msgs::String::ConstPtr msg) {c-printdata();c2-printdata(); } int main(int argc, char **argv) {ros::init(argc, argv, share_test); share_test share_test;share_test.init();ros::spin(); return 0; }这里与上面的例子略有不同这里的calss C定义了一个初始化函数需要传递两个参数同时在它的print函数中会打印这两个参数。而在class share_test中创建了两个指针 std::shared_ptrC c;std::shared_ptrC c2;随后我们再次使用make_unique创建了两个指向class C的智能指针 c std::make_uniqueC(1,abc);c2 std::make_uniqueC(2,abcd);编译运行这个程序终端会显示如下 可以看到这里输出了4条打印这是因为share_test::init()函数初始化了两个智能指针class C这个类作为模板类被使用了两次。 而后我们再次触发一下subscriber回调函数可以显示打印如下 到这里执行了两次打印调用 c-printdata(); c2-printdata();这两个智能指针虽然是指向了同一个模板类但是由于我们在创建的时候传参是不一样的因此它们的打印结果也是不一样的这个就是模板类与智能指针的好处了通常我们只需要定一一个类函数然后通过这样一个make_unique的方式创建一个智能指针就可以使用它里面的一些函数同时由于它的指针是独享的因此我虽然两个指针指向的是同一个类但是由于类初始化时传递的参数不一致最后得到的结果也是不一致的这就极大的便利了一些重复性类函数的使用例如在cartographer中使用的子图的概念就是通过类函数与指针的形式实现的。 参考 std::shared_ptr 详解 shared_ptr(共享指针)使用总结 C11新特性之十三std::make_unique和std::make_shared C 的 make_unique含 C 代码示例
http://www.hkea.cn/news/14588344/

相关文章:

  • 浙江省专业网站制作网站建设赤峰网站建设 公司
  • 网站建设 佛山市wordpress 不显示中文图片
  • 自己做营销网站wordpress解决新浪图床
  • 优化网站推广排名前沿设计公司网站
  • 服装网站建设策划书论文网站和网页
  • 物流公司怎么做网站美橙互联
  • 公司品牌的塑造网站建设嵌入式软件开发专业
  • 广州哪家做网站好东莞保安公司联系电话
  • 做网站的镜像是什么意思万博法务网站
  • wordpress网站安装插件湘潭交通网站
  • 大型门户网站建设一般多少钱wordpress缩略图不显示图片
  • 南通网站定制公司设计素材网站黄金烤肠
  • 深圳建网站就找兴田德润优化方案官网电子版
  • 在国外怎么做网站文档里网站超链接怎么做
  • 建立一个网站多少钱WordPress站群更新
  • 东海县建设局网站中国建设网官方网站企业
  • 南昌网站建设哪家比较好找黄岩做网站企业
  • 玉溪市网站建设推广自己的网站做app
  • 襄阳专业网站建设wordpress拉黑用户
  • 衡阳网站开发培训建立个人网站需要什么
  • 深圳做营销网站公司哪家好wordpress登录及注册
  • 新鸿儒做网站wordpress有几张表
  • 台州网站建设蓝渊个人网站怎么做支付功能
  • 如何制作网站导航广告发布与制作
  • 娄底企业网站建设公司房地产交易网站
  • 万峰科技.jsp网站开发四酷全书[m]做网站宁波大点的网络公司
  • 做网站需要材料手机网站设计趋势
  • 榆林市行政效能建设网站网站开发后台编辑系统
  • 郑州网站seo外包公司优化公司管理
  • html网站建设实录要怎么做网络推广