草庐IT

复制集

全部标签

c++ - 具有自动默认和移动构造函数的不可复制类

我想让一些类使用自动生成的构造函数,但不可复制(但仍可移动)。目前我是这样做的:classA{public:A()=default;A(constA&)=delete;A(A&&)=default;A&operator=(constA&)=delete;A&operator=(A&&)=default;}我想知道是否真的有必要如此明确。如果我这样写会怎样:classA{A(constA&)=delete;A&operator=(constA&)=delete;}它还会像以前一样工作吗?其他情况下的最小默认值和删除集是什么-不可复制不可移动的类,以及具有虚拟析构函数的类?是否有任何测试代

c++ - shared_ptr 析构函数、复制和不完整类型

我有一个头文件foo.h像这样(省略不相关的东西):#pragmaonce#includeclassBar;structFoo{std::shared_ptrgetBar();std::shared_ptrgetBar()const{returnconst_cast(this)->getBar();}};getBar()的非常量重载在.cpp文件中实现,该文件还可以看到Bar的完整定义.当foo.h包含在另一个文件中(没有看到Bar的定义),VS2010给我这样的警告:warningC4150:deletionofpointertoincompletetype'Bar';nodestr

c++ - 有没有办法结合编译器防火墙(Pimpl)和默认可复制性的好处?

假设我有一个带有私有(private)成员的类,这是类的客户不关心的实现细节。这个类是一个值类型,我们希望它是可复制的,例如#include//someheaderthatpullsinmanyotherfilesclassMyClass{public:MyClass(){}...private:boost::bimaptable;};现在,MyClass的每个客户端都被迫引入许多它并不真正需要的boostheader,从而增加了构建时间。但是,该类至少是可复制的。如果我们引入编译器防火墙(Pimpl习惯用法),那么我们可以将#include依赖项移动到cpp文件,但由于5规则,现在我

c++ - 为什么在使用复制分配运算符时需要删除资源?

例如我的一本书中的代码:classHasPtr{public:HasPtr(constHasPtr&h):ps(newstd::string(*h.ps)),i(h.i){}HasPtr(conststd::string&s=std::string()):ps(newstd::string(s)),i(0){}HasPtr&operator=(constHasPtr&);~HasPtr(){deleteps;}private:std::string*ps;inti;};HasPtr&HasPtr::operator=(constHasPtr&rhs){autonewp=newstrin

c++ - vector move 构造函数比复制构造函数慢

我正在开发我的第一个C++项目,它是一个CSV解析器(fullsourcecodehere)。它正处于工作状态,现在我想进行基本的重构/提高性能。目前解析器的工作方式是将每一行作为std::vector返回,我想与其每次都分配一个新的vector和一个新的字符串,不如我有一个内部vector和一个带有保留内存的内部字符串,我会一次又一次地清除。这行得通,我开始查看其他可能进行内存分配的地方,我看到了这个复制内部vector然后清除它的函数:autoadd_row()->std::vector{autorow(m_bufvec);m_bufvec.clear();returnrow;}我

c++ - 如何为具有 std::stringstream 成员的类编写复制构造函数?

如果我有这样一个类,我应该怎么写拷贝构造函数?#includeclassMyClass{std::stringstreamstrm;public:MyClass(constMyClass&other){//...}std::stringtoString()const{returnstrm.str();}};std::stringstream本身没有复制构造函数,所以我不能使用这样的初始化列表:MyClass(constMyClass&other):strm(other.strm){} 最佳答案 你可以试试这个:MyClass(con

c++ - 复制构造函数、析构函数和赋值运算符。我们什么时候不需要它们?

我知道在你的类中添加cctor、dtor或op=时的C++经验法则,你还需要添加另外两个以使你的类在所有情况下都能正常工作。是否存在不需要提供全部三个而只需提供其中一两个的情况?如果您将其中一个添加到您的类中,为什么C++不要求您将它们全部添加?编辑1:当您不仅不需要其中一些,而且不想拥有它们时,您提到了示例,因此您希望将它们设为私有(private)或protected。但是即使是空体,您仍然需要在代码中编写它们。当你通过添加一个空主体的虚拟析构函数来使类多态时,我没有全部拥有它们的唯一正当理由。但是一旦你在析构函数的主体中写了一些东西,你就应该考虑在cctor和op=的主体中也写一

c++ - 从成员复制方法

我有一个简单的低级容器类,由更高级别的文件类使用。基本上,文件类在将最终版本保存到实际文件之前使用容器在本地存储修改。因此,一些方法直接从容器类转移到文件类。(例如,Resize()。)我刚刚在文件类中定义方法来调用它们的容器类变体。例如:voidFileClass::Foo(){ContainerMember.Foo();}然而,这正变得令人讨厌。有更好的方法吗?这是一个简化的例子:classMyContainer{//...public:voidFoo(){//Thisfunctiondirectlyhandlestheobject's//membervariables.}}cla

c++ - 复制省略法

来自复制省略法的标准定义:InC++computerprogramming,copyelisionreferstoacompileroptimizationtechniquethateliminatesunnecessarycopyingofobjects.让我们考虑以下代码:#include#includeusingnamespacestd;intn=0;structC{C(int){}C(constC&){++n;}};intmain(intargc,char*argv[]){Cc1(42);Cc2=42;returnn;}“returnn”这一行将返回0或1,具体取决于拷贝是否被

c++ - 将 C++ 映射复制到键和值 vector 中

我有一个map并且我希望第一列i.e(*it).first被推回一个vector然后(*i​​t)->second被推回到另一个vector中这是最好的方法吗?std::vectortest;for(it=mymap.begin();it!=mymap.end();it++){test.push_back((*it).first);}我的另一个问题是如果我有一个循环即我如何将所有整数i插入到(*i​​t).first中?for(inti=0;i我想在(*i​​t).first中有一些整数,并在(*i​​t).second;中有相关值 最佳答案