学习PCL库你应该知道的C++特性
要學(xué)會(huì)PCL首先要對(duì)C++進(jìn)行學(xué)習(xí),所以這里我們首先對(duì)PCL庫(kù)的代碼中常見(jiàn)的C++的技巧進(jìn)行整理和概述,并且對(duì)其中的難點(diǎn)進(jìn)行細(xì)化講解。首先我們搞清楚PCL庫(kù)的文件形式、是一個(gè)以CMake構(gòu)建的項(xiàng)目,庫(kù)中主要以cpp,.h,.hpp文件三種文件形式。那我們知道cpp是C++工程中函數(shù)實(shí)現(xiàn)的代碼,以下是根據(jù)PCL庫(kù)中的代碼中常用的C++特征。基本介紹請(qǐng)查看文章:點(diǎn)云及PCL編程基礎(chǔ)
.h和.hpp文件的區(qū)別
與*.h類似,hpp是C++程序頭文件,其實(shí)質(zhì)是將cpp中的實(shí)現(xiàn)代碼放在.hpp文件中,定義與實(shí)現(xiàn)都包含在同一個(gè)文件中,在使用的時(shí)候只需要include 該hpp文件即可,無(wú)需將cpp加入到項(xiàng)目中進(jìn)行編譯,而實(shí)現(xiàn)代碼將直接編譯到調(diào)用者的obj文件中,不再單獨(dú)生成obj,采用hpp將大幅度的減少調(diào)用項(xiàng)目中cpp文件數(shù)和編譯次數(shù),也不用發(fā)布lib或者dll,因此非常適合用來(lái)編寫公開的開源庫(kù)。
該文件具有的特點(diǎn):
.hpp與.h文件類似,hpp也是C++程序的頭文件。
是一般模板類的頭文件
一般來(lái)說(shuō)。.h文件只有申明,沒(méi)有函數(shù)的實(shí)現(xiàn),.hpp里申明與實(shí)現(xiàn)都有,后者可以減少cpp的數(shù)量
*.h里面可以有using namespace std,而*.hpp里盡量不要出現(xiàn)。
*.hpp要注意的問(wèn)題有:
不可包含全局對(duì)象和全局函數(shù):由于hpp本質(zhì)上是作為.h被調(diào)用者include,所以當(dāng)hpp文件中存在全局對(duì)象或者全局函數(shù),而該hpp被多個(gè)調(diào)用者include時(shí),將在鏈接時(shí)導(dǎo)致符號(hào)重定義錯(cuò)誤。要避免這種情況,需要去除全局對(duì)象,將全局函數(shù)封裝為類的靜態(tài)方法。
類之間不可循環(huán)調(diào)用:在.h和.cpp的場(chǎng)景中,當(dāng)兩個(gè)類或者多個(gè)類之間有循環(huán)調(diào)用關(guān)系時(shí),只要預(yù)先在頭文件做被調(diào)用類的聲明即可。在hpp場(chǎng)景中,由于定義與實(shí)現(xiàn)都已經(jīng)存在于一個(gè)文件,調(diào)用者必需明確知道被調(diào)用者的所有定義,而不能等到cpp中去編譯。因此hpp中必須整理類之間調(diào)用關(guān)系,不可產(chǎn)生循環(huán)調(diào)用。
不可使用靜態(tài)成員:靜態(tài)成員的使用限制在于如果類含有靜態(tài)成員,則在hpp中必需加入靜態(tài)成員初始化代碼,當(dāng)該hpp被多個(gè)文檔include時(shí),將產(chǎn)生符號(hào)重定義錯(cuò)誤。唯 一的例外是const static整型成員。
#progma once 與ifndef的區(qū)別
為了避免同一個(gè)文件被include 多次,在能夠支持這兩種方式的編譯器上,二者并沒(méi)有太大的區(qū)別,但是兩者仍然還是有一些細(xì)微的區(qū)別。
#ifndef的方式依賴于宏名字不能沖突,這不光可以保證同一個(gè)文件不會(huì)被包含多次,也能保證內(nèi)容完全相同的兩個(gè)文件不會(huì)被不小心同時(shí)包含。當(dāng)然,缺點(diǎn)就是如果不同頭文件的宏名不小心"撞車",可能就會(huì)導(dǎo)致頭文件明明存在,編譯器卻硬說(shuō)找不到聲明的狀況
#pragma once則由編譯器提供保證:同一個(gè)文件不會(huì)被包含多次。注意這里所說(shuō)的"同一個(gè)文件"是指物理上的一個(gè)文件,而不是指內(nèi)容相同的兩個(gè)文件。帶來(lái)的好處是,你不必再費(fèi)勁想個(gè)宏名了,當(dāng)然也就不會(huì)出現(xiàn)宏名碰撞引發(fā)的奇怪問(wèn)題。對(duì)應(yīng)的缺點(diǎn)就是如果某個(gè)頭文件有多份拷貝,本方法不能保證他們不被重復(fù)包含。當(dāng)然,相比宏名碰撞引發(fā)的"找不到聲明"的問(wèn)題,重復(fù)包含更容易被發(fā)現(xiàn)并修正。
方式一由語(yǔ)言支持所以移植性好,方式二 可以避免名字沖突
C++模塊類
模板是C++支持參數(shù)化多態(tài)的工具,使用模板可以使用戶為類或者函數(shù)申明一種一般的模式,使得類中的某些數(shù)據(jù)成員或者成員函數(shù)的參數(shù),返回值取得任意類型。
模板是一種對(duì)類型進(jìn)行參數(shù)化的工具,通常有兩種形式:函數(shù)模板和類模板。
函數(shù)模板針對(duì)僅參數(shù)類型不同的函數(shù),類模板針對(duì)僅數(shù)據(jù)成員和成員函數(shù)類型不同的類。
注意:模板的申明或者定義智能在全局,命名空間或者類范圍內(nèi)進(jìn)行,既不能在局部范圍,函數(shù)內(nèi)進(jìn)行,比如不能在主函數(shù)中申請(qǐng)或者定義一個(gè)模板。
比如在common/centroid.h文件中
template <typename PointT, typename Scalar> inline unsigned intcompute3DCentroid (ConstCloudIterator<PointT> &cloud_iterator,Eigen::Matrix<Scalar, 4, 1> ¢roid);
其中類模板和函數(shù)模板都是以template開始后接模板形參列表組成,模板形參不能為空,一但聲明了類模板就可以用類模板的形參名聲明類中的成員變量和成員函數(shù),即可以在類中使用內(nèi)置類型的地方都可以使用模板形參名來(lái)聲明。
inline函數(shù)的作用
在C++中, 為了解決一些頻繁調(diào)用的小涵數(shù)大量消耗??臻g或者是叫棧內(nèi)存的問(wèn)題,特別的引入了inline修飾符,表示為內(nèi)聯(lián)涵數(shù)。
inline的使用時(shí)有所限制的,inline只適合函數(shù)體內(nèi)部代碼簡(jiǎn)單的函數(shù)使用,不能包含復(fù)雜的結(jié)構(gòu)控制語(yǔ)句例如while、switch,并且不能內(nèi)聯(lián)函數(shù)本身不能是直接遞歸函數(shù)(即,自己內(nèi)部還調(diào)用自己的函數(shù))。
關(guān)鍵字inline 必須與函數(shù)定義體放在一起才能使函數(shù)成為內(nèi)聯(lián),僅將inline 放在函數(shù)聲明前面不起任何作用。
extern“C”的作用
extern "C"的真實(shí)目的是實(shí)現(xiàn)類C和C++的混合編程。extern “C”是由C++提供的一個(gè)連接交換指定符號(hào),用于告訴C++這段代碼是C函數(shù)。extern “C”后面的函數(shù)不使用的C++的名字修飾,而是用C。這是因?yàn)镃++編譯后庫(kù)中函數(shù)名會(huì)變得很長(zhǎng),與C生成的不一致,造成C++不能直接調(diào)用C函數(shù)。
#define PCL_EXPORTS __declspec(dllexport)
一般而言,動(dòng)態(tài)鏈接庫(kù)中定義有兩種函數(shù):導(dǎo)出函數(shù)(export function)和內(nèi)部函數(shù)(internal function)。導(dǎo)出函數(shù)可以被其它模塊調(diào)用,內(nèi)部函數(shù)在定義它們的DLL程序內(nèi)部使用。在要輸出的函數(shù)、類、數(shù)據(jù)的聲明前加上__declspec(dllexport)的修飾符,表示輸出,導(dǎo)入修飾__declspec(dllimport),聲明某個(gè)類、函數(shù)是從dll中導(dǎo)入的。
資源
三維點(diǎn)云論文及相關(guān)應(yīng)用分享
【點(diǎn)云論文速讀】基于激光雷達(dá)的里程計(jì)及3D點(diǎn)云地圖中的定位方法
3D目標(biāo)檢測(cè):MV3D-Net
三維點(diǎn)云分割綜述(上)
3D-MiniNet: 從點(diǎn)云中學(xué)習(xí)2D表示以實(shí)現(xiàn)快速有效的3D LIDAR語(yǔ)義分割(2020)
win下使用QT添加VTK插件實(shí)現(xiàn)點(diǎn)云可視化GUI
JSNet:3D點(diǎn)云的聯(lián)合實(shí)例和語(yǔ)義分割
大場(chǎng)景三維點(diǎn)云的語(yǔ)義分割綜述
PCL中outofcore模塊---基于核外八叉樹的大規(guī)模點(diǎn)云的顯示
基于局部凹凸性進(jìn)行目標(biāo)分割
基于三維卷積神經(jīng)網(wǎng)絡(luò)的點(diǎn)云標(biāo)記
點(diǎn)云的超體素(SuperVoxel)
基于超點(diǎn)圖的大規(guī)模點(diǎn)云分割
更多文章可查看:點(diǎn)云學(xué)習(xí)歷史文章大匯總
SLAM及AR相關(guān)分享
【開源方案共享】ORB-SLAM3開源啦!
【論文速讀】AVP-SLAM:自動(dòng)泊車系統(tǒng)中的語(yǔ)義SLAM
【點(diǎn)云論文速讀】StructSLAM:結(jié)構(gòu)化線特征SLAM
SLAM和AR綜述
常用的3D深度相機(jī)
AR設(shè)備單目視覺(jué)慣導(dǎo)SLAM算法綜述與評(píng)價(jià)
SLAM綜述(4)激光與視覺(jué)融合SLAM
Kimera實(shí)時(shí)重建的語(yǔ)義SLAM系統(tǒng)
SLAM綜述(3)-視覺(jué)與慣導(dǎo),視覺(jué)與深度學(xué)習(xí)SLAM
易擴(kuò)展的SLAM框架-OpenVSLAM
高翔:非結(jié)構(gòu)化道路激光SLAM中的挑戰(zhàn)
SLAM綜述之Lidar SLAM
基于魚眼相機(jī)的SLAM方法介紹
往期線上分享錄播匯總
第一期B站錄播之三維模型檢索技術(shù)
第二期B站錄播之深度學(xué)習(xí)在3D場(chǎng)景中的應(yīng)用
第三期B站錄播之CMake進(jìn)階學(xué)習(xí)
第四期B站錄播之點(diǎn)云物體及六自由度姿態(tài)估計(jì)
第五期B站錄播之點(diǎn)云深度學(xué)習(xí)語(yǔ)義分割拓展
第六期B站錄播之Pointnetlk解讀
[線上分享錄播]點(diǎn)云配準(zhǔn)概述及其在激光SLAM中的應(yīng)用
[線上分享錄播]cloudcompare插件開發(fā)
[線上分享錄播]基于點(diǎn)云數(shù)據(jù)的?Mesh重建與處理
[線上分享錄播]機(jī)器人力反饋遙操作技術(shù)及機(jī)器人視覺(jué)分享
[線上分享錄播]地面點(diǎn)云配準(zhǔn)與機(jī)載點(diǎn)云航帶平差
如果你對(duì)本文感興趣,請(qǐng)點(diǎn)擊“原文閱讀”獲取知識(shí)星球二維碼,務(wù)必按照“姓名+學(xué)校/公司+研究方向”備注加入免費(fèi)知識(shí)星球,免費(fèi)下載pdf文檔,和更多熱愛(ài)分享的小伙伴一起交流吧!
以上內(nèi)容如有錯(cuò)誤請(qǐng)留言評(píng)論,歡迎指正交流。如有侵權(quán),請(qǐng)聯(lián)系刪除
掃描二維碼
? ? ? ? ? ? ? ? ? ?關(guān)注我們
讓我們一起分享一起學(xué)習(xí)吧!期待有想法,樂(lè)于分享的小伙伴加入免費(fèi)星球注入愛(ài)分享的新鮮活力。分享的主題包含但不限于三維視覺(jué),點(diǎn)云,高精地圖,自動(dòng)駕駛,以及機(jī)器人等相關(guān)的領(lǐng)域。
分享及合作:群主微信“920177957”(需要按要求備注) 聯(lián)系郵箱:dianyunpcl@163.com,歡迎企業(yè)來(lái)聯(lián)系公眾號(hào)展開合作。
點(diǎn)一下“在看”你會(huì)更好看耶
總結(jié)
以上是生活随笔為你收集整理的学习PCL库你应该知道的C++特性的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: F-LOAM:基于激光雷达的快速里程计和
- 下一篇: 实时的激光雷达点云压缩