Lepus经历收获杂谈(一)——confirm features的小工具
------记Project of AIM_PointCloudTrainingManager------
---------------------------------------------------------------------------------------------------------
->SnippetListItem.cpp:
#include "stdafx.h" #include "SnippetListItem.h" #include "moc_SnippetListItem.cpp" #include "ui_SnippetListItem.h" #include "SnippetImager.h" #include <alx/Utils/make_unique.h> #include <alx/Platform/StringUtils.h> #include <alx/Platform/Platform.h> #include <alx/Inline/IEnumerate.h> #include <alx/UIPlatform/API/Widget/Widget.h> namespace alx{ SnippetListItem::SnippetListItem( const SnippetInfo& snippet ) : m_ui(std::make_unique<Ui::SnippetListItem>()) { m_ui->setupUi(this); init(snippet); } void SnippetListItem::init( const SnippetInfo& snippet ) { m_categories.emplace_back("Sign"); m_categories.emplace_back("Traffic Light"); m_categories.emplace_back("Tree"); m_categories.emplace_back("Unknown"); for ( const auto& item : m_categories ) m_ui->m_comboBoxCategory->addItem( W2Q( Utf8ToW(item) ) ); m_ui->m_textEditSimilarity->append( W2Q( snippet.description ) ); m_ui->m_textEditSimilarity->append( W2Q( StringUtils::Int2String( snippet.points.size() ) + L" points" ) ); m_ui->m_textEditSimilarity->append( W2Q( L"Confirmed: " + Utf8ToW( snippet.confirmedCategoryID ) ) ); m_ui->m_textEditSimilarity->append( W2Q( L"Recognized: " + Utf8ToW( snippet.recognizedCategoryID ) ) ); for ( const auto& item : snippet.similarity ) { m_ui->m_textEditSimilarity->append( W2Q( Utf8ToW( item.first) + L": " + StringUtils::Double2String(item.second) ) ); } if( snippet.confirmedCategoryID.empty() ) m_ui->m_comboBoxCategory->setCurrentText( W2Q(Utf8ToW("Unknown") ) ); else m_ui->m_comboBoxCategory->setCurrentText( W2Q(Utf8ToW( snippet.confirmedCategoryID ) ) ); connect(m_ui->m_comboBoxCategory, SIGNAL(currentIndexChanged(int)), this, SLOT(onCategoryComboBoxIndexChanged(int))); connect(m_ui->m_checkBoxConfirm, SIGNAL(stateChanged(int) ), this, SLOT(onConfirmCheckBoxStateChanged(int))); m_snippetID = snippet.snippetID; SnippetImager snpImager; auto images = snpImager.getImages( snippet.points ); if ( images.size() == 5 ) { auto iconSize = QSize(100,100); m_ui->m_pushButton1->setIcon( QPixmap::fromImage( *(images[0].get()) ) ); m_ui->m_pushButton1->setIconSize(iconSize); m_ui->m_pushButton2->setIcon( QPixmap::fromImage( *(images[1].get()) ) ); m_ui->m_pushButton2->setIconSize(iconSize); m_ui->m_pushButton3->setIcon( QPixmap::fromImage( *(images[2].get()) ) ); m_ui->m_pushButton3->setIconSize(iconSize); m_ui->m_pushButton4->setIcon( QPixmap::fromImage( *(images[3].get()) ) ); m_ui->m_pushButton4->setIconSize(iconSize); m_ui->m_pushButton5->setIcon( QPixmap::fromImage( *(images[4].get()) ) ); m_ui->m_pushButton5->setIconSize(iconSize); } } void SnippetListItem::onCategoryComboBoxIndexChanged( int index ) { m_ui->m_checkBoxConfirm->setChecked(true); } void SnippetListItem::onConfirmCheckBoxStateChanged( int state ) { if( 2 == state ) { m_ui->m_textEditSimilarity->setStyleSheet("QTextEdit { background: pink }"); } else { m_ui->m_textEditSimilarity->setStyleSheet("QTextEdit { background: white }"); } } std::string SnippetListItem::getSnippetId() { return m_snippetID; } std::string SnippetListItem::getCategory() { return m_ui->m_comboBoxCategory->currentText().toStdString(); } int SnippetListItem::getConfirmState() { return m_ui->m_checkBoxConfirm->checkState(); } }
分析:
1、命名空间(namespace)是一种描述逻辑分组的机制,可以将按某些标准在逻辑上属于同一个任务中的所有类声明放在同一个命名空间中。传统的C++只有一个全局的namespace,但是由于现在的程序的规模越来越大,程序的分工越来越细,全局作用域变得越来越拥挤,每个人都可能使用相同的名字来实现不同的库,于是程序员在合并程序的时候就会可能出现名字的冲突。namespace引入了复杂性,解决了这个问题。
标准C++库(不包括标准C库)中所包含的所有内容(包括常量、变量、结构、类和函数等)都被定义在命名空间std(standard标准)中了。
--->命名空间的定义格式为:(取自C++标准文档)
有名的命名空间:
namespace 命名空间名 {
声明序列可选
}
无名的命名空间:
namespace {
声明序列可选
}
--->命名空间的成员,是在命名空间定义中的花括号内声明了名称。可以在命名空间的定义内,定义命名空间的成员(内部定义)。也可以只在命名空间的定义内声明成员,而在命名空间的定义之外,定义命名空间的成员(外部定义)。
命名空间成员的外部定义的格式为:
命名空间名::成员名 ……
注意:
不能在命名空间的定义中声明(另一个嵌套的)子命名空间,只能在命名空间的定义中定义子命名空间。
也不能直接使用“命名空间名::成员名 ……”定义方式,为命名空间添加新成员,而必须先在命名空间的定义中添加新成员的声明。
另外,命名空间是开放的,即可以随时把新的成员名称加入到已有的命名空间之中去。方法是,多次声明和定义同一命名空间,每次添加自己的新成员和名称。
还可以用多种方法,来组合现有的命名空间,让它们为我所用。
--->对命名空间中成员的引用,需要使用命名空间的作用域解析运算符::。
可以使用标准C++的using编译指令来简化对命名空间中的名称的使用。格式为:
using namespace 命名空间名[::命名空间名……];
在这条语句之后,就可以直接使用该命名空间中的标识符,而不必写前面的命名空间定位部分。因为 using指令,使所指定的整个命名空间中的所有成员都直接可用。
PS:namespace可以使用别名,在对一些名字比较长的namespace使用别名的话,是一件很惬意的事。但是与using相同,最好避免在头文件使用namespace的别名(f比first更容易产生冲突)。
namespace f = first;
而且namespace提供了单独的作用域,它类似于静态全局声明的使用,可以使用未命名的namespace定义来实现:
namespace { int count = 0;} //这里的count是唯一的
//在程序的其它部分中count是有效的
void chg_cnt (int i) { count = i; }
2、对于C++中的类,结构体,共用体等具有成员函数或变量的数据类型(对象)时,如果存在对象a,而对象中有成员b,那么可以使用a.b的方式,使用对应的成员。
如果存在变量p,指向a, 即p = &a, 这时可以用p->b来使用成员b。
即,->操作符是用于带成员的类型对应指针上,用来提取成员变量或函数用的。
p->b等同于(*p).b。
对于任意的对象a,写作(&a)->b也是可以的,不过很少有这样写。
3、关于智能指针: