草庐IT

c++ - 定义前向输出迭代器的规范方式

如何以规范的方式在C++11中定义前向输出迭代器?根据标准,forward_iterator只是一个input_iterator。所以对应的forward_iterator_tag只是extendsinput_iterator_tag。如果我们使用std::iterator来定义我们的迭代器,我们为前向输出迭代器使用什么标签?定义一个扩展forward_iterator_tag和output_iterator_tag的私有(private)标签是规范的还是有更好的解决方案? 最佳答案 规范的做法是继承std::iterator只要。

c++ - 删除前将指针设置为 NULL

所以我偶然发现了这段代码,虽然我已经使用C/C++编写代码大约5年了,但我无法理解为什么有人想要这样做。我理解为什么你想在释放内存后将指针设置为NULL,但我当然不明白为什么有人会想做相反的事情(对我来说看起来像是内存泄漏)。其次,我很确定在将指针设置为NULL并删除它之前没有必要检查指针是否为NULL,asdiscussedhere.if(m_pio){m_pio=NULL;deletem_pio;} 最佳答案 两次删除对象会导致析构函数被调用两次,因此有些人喜欢在删除后将其设置为NULL。这可以防止在本可以从指针的先前内存地址重

c++ - 前/后增量的左值和右值

学习左值和右值。定义是任何可以是“地址”的东西都是左值,否则就是右值。我检查了运算符的优先级,前缀和后缀增量都比“地址”运算符具有更高的优先级。对于下面的两个例子,谁能解释一下为什么第一个“&++value1”是左值而第二个“&value1++”是右值。我对这两种情况的错误理解是:pValue1指向value1变量。无论在建立地址关联之前还是之后将value1改为8,value1变量总是占据一个内存位置,我们可以推导出它的地址,对吧?intvalue1=7;int*pValue1=&++value1;int*pValue1=&value1++; 最佳答案

c++ - 从 std::map 中删除前 N 个项目?

尝试编写一种方法,从std::map中删除前(最低键)N项。试过这个:voidEraseNMapElements(constintnumElementsToRemove){constintoriginalSize=_map.size();autoeraseIter=_map.begin();std::advance(eraseIter,numElementsToRemove);_map.erase(_map.begin(),eraseIter);assert(_map.size()==(originalSize-numElementsToRemove))||(0==originalSi

c++ - 为什么不允许前向声明将是 typedef 的类?

如果我想使用一个指向类的指针并且不对其进行任何操作,我们可以前向声明该类。但如果那恰好是一个typedef,为什么不允许呢?在下面的示例中,它仅编译我包含注释代码,但为什么编译器此时想知道它?我如何转发声明可能是typedef的内容。c++0x中的这种行为有什么变化吗?#includeusingnamespacestd;/*templateclasstemp;typedeftemplater;*/classlater;voidsomefunc(later*);intmain(){later*l;somefunc(l);return0;}//Thefollowingisinsomeoth

c++ - 重载前增量和后增量

我看到一个关于实现pre-increment和post-increment的例子,它声称重载pre-increment可以定义为T&T::operator++()重载post-increment可以按照pre-incremet定义和实现如下constTT::operator++(int){constTold(*this);++(*this);returnold;}我有两个问题:1)“旧”是什么意思?2)++(*this)假定使用预自增,原预自增定义没有参数。但是,这里有*this。 最佳答案 whatdoes"old"mean?该方

c++ - 是否返回一个前向声明的结构未定义行为?

我有以下代码(为简单起见省略了包含保护):=foo.hpp=structFOO{intnot_used_in_this_sample;intnot_used_in_this_sample2;};=main.cpp=#include"foo_generator.hpp"#include"foo.hpp"intmain(){FOOfoo=FooGenerator::createFoo(0xDEADBEEF,0x12345678);return0;}=foo_generator.hpp=structFOO;//FOOisonlyforward-declaredclassFooGenerato

c++ - 类名前的宏

我最近在查看一些代码,我偶然发现了这个:classIDATA_EXPORTIData{/*....*/}IDATA_EXPORT不超过:#ifndefIDATA_EXPORT#defineIDATA_EXPORT#endif在这种情况下,IDATA_EXPORT是什么?(我的意思是,它是int、char等类型吗?) 最佳答案 很可能在某个时间点或在某些条件下它被定义为(例如,在MSVC下):#defineIDATA_EXPORT__declspec(dllexport)用于指示要从库中公开导出的类。使用宏,开发人员可以在导出类和不导

c++ - 是否值得前向声明库类?

我刚刚开始使用他们的教程学习Qt。我目前正在学习教程7,我们在其中创建了一个新的LCDRange类。LCDRange(.cpp文件)的实现使用了Qt的QSlider类,所以在.cpp文件中是#include但在标题中是一个前向声明:classQSlider;根据Qt,Thisisanotherclassictrick,butonethat'smuchlessusedoften.Becausewedon'tneedQSliderintheinterfaceoftheclass,onlyintheimplementation,weuseaforwarddeclarationofthecla

c++ - 构造函数名称前的关键字 struct

当我看到这段代码用MSVisualC++编译成功时,我很惊讶。structfoo{structfoo(inti):value(i){}intvalue;};在如此奇怪的上下文中关键字struct是什么意思? 最佳答案 在大多数情况下,您可以使用精心设计的类型说明符structfoo,或等同于classfoo,而不仅仅是类名富。这对于解决歧义很有用:structfoo{};//Declaresatypefoofoo;//Declaresavariablewiththesamenamefoobar;//Error:"foo"refers