草庐IT

c++ - 在虚拟继承中交换和复制成语的正确方法是什么?

考虑经典的虚拟继承菱形层次结构。我想知道在这种层次结构中copy-and-swap习语的正确实现是什么。example有点人为-而且它不是很聪明-因为它可以很好地处理A、B、D类的默认复制语义。但只是为了说明问题-请忘记示例弱点并提供解决方案。所以我有从2个基类(B,B)派生的类D-每个B类实际上都继承自A类。每个类都有使用copy-and-swap习语的非平凡复制语义。最派生的D类在使用这个习惯用法时有问题。当它调用B和B交换方法时-它交换虚拟基类成员两次-所以A子对象保持不变!!!答:classA{public:A(constchar*s):s(s){}A(constA&o):s(

c++ - 如何防止复制省略?

我有一个名为sfract的类,它存储指向二叉树根节点的指针。显然,当复制构造一个sfract时,我需要克隆另一个sfract对象的二叉树。但是,复制构造函数从未被调用,我认为是因为复制省略。这会导致两个sfract对象在解构时引用并尝试释放同一个根节点。我怎样才能防止这种情况发生?//main.cppsfract_typea(/*...*/);sfract_typeb(/*...*/);sfract_typec(a);//copyconstruct//sfract.htemplatesfract(sfractconst&other){//Cloneother'srootnodeanda

C++ 将流操纵器复制到其他流

想象一个std::ostream&operator想用数字做一些事情。为此,有人可能想使用std::hex,其他一些人可能不想使用任何操纵器,无论如何,任何操纵器都是可能的。我如何将它们复制到另一个std::ostream没有ostream的文本内容作为参数通过?我只需要操纵器。所以我想要那个std::cout,其中someCoolClass可能看起来像structsomeCoolClass{someCoolClass(inti):_i(i){}friendstd::ostream&operator打印a.我知道这个例子是无用的,尤其是将整数转换为字符串的其他流似乎是无用的,但让我们想

c++ - 在这种情况下我们需要禁用默认的复制构造函数和赋值运算符?

如果我们将复制构造函数和赋值运算符设为私有(private)且不提供任何实现,它们将被禁用,如下所示:classTest{private:Test(constTest&);Test&operator=(constTest&);};但在什么情况下我们需要这样做?我的意思是我们什么时候应该这样做? 最佳答案 当您希望此类的对象不可复制时。当对象不能或不应该被复制到其他对象时,可能有很多原因。几个例子是:日志文件一些突变体单例模式对象工厂一些版本的智能指针对于上述示例,编译器提供的默认复制构造函数和默认赋值运算符版本可能会导致意外结果。c

c++ - 非阻塞 worker - 中断文件复制

我正在处理非常大的文件,大小超过数百GB。用户需要能够在磁盘之间移动这些文件,并且在没有默认文件管理器的受限系统上。用户有可能意识到他们犯了错误并取消操作,据我所知,用户将不得不等待当前的复制或重命名操作完成。这可能会让他们感到沮丧,因为他们可能会等待几分钟,却发现他们的许多GB文件仍然被复制。在复制的情况下,我可以删除第二个文件,但在我用来移动文件的重命名的情况下,我必须反向重复操作以撤消它,这是NotAcceptable。有没有什么方法可以中断我在QFile的文档中没有看到的copy()和rename(),或者我是否需要将我自己的类放在一起来处理复制和重命名?

c++ - 同一对象的双 move 是从左向右复制吗?

我只是c++11中move操作的初学者,所以玩它。但是发现了一些我无法理解的东西。#includeusingnamespacestd;classA{public:A(){coutCORRECT!!coutCORRECT!!b=std::move(a);//idon'tknowmaybesillybutstillletsdoitWHYNOT!!!,couldbejustmistake??coutWRONG!!coutWRONG!!}我原以为b=std::move(a)操作会有所不同,因为我第二次在对象a上应用move,但它正在向左复制侧面对象b到右侧对象a,这部分我不明白。或者我在编程中

c++ - 为什么auto_ptr中有模板复制构造函数和重写操作函数?

为什么auto_ptr中有模板复制构造函数和重写操作函数?C++的ISO标准为auto_ptr指定了以下接口(interface)。(这是直接从2003年的标准中复制出来的。)namespacestd{templatestructauto_ptr_ref{};templateclassauto_ptr{public:typedefXelement_type;//20.4.5.1construct/copy/destroy:explicitauto_ptr(X*p=0)throw();auto_ptr(auto_ptr&)throw();templateauto_ptr(auto_ptr

c++ - 我可以复制到 multimap 吗

给定一个istream_iterator和multimapoutput.我想将所有值复制到output中的'a'key。最好的处理方式是什么?我曾尝试使用:transform(istream_iterator(input),istream_iterator(),begin(output),[](constautovalue){returnmake_pair('a',value);})但是我得到了错误:error:assignmentofread-onlymemberstd::pair::first我认为这意味着我无法写入begin(output).我唯一的选择是使用for_each?

c++ - 制作一个 const unique_ptr 然后尝试从它 std::move 给出相同的错误,就好像您试图访问复制构造函数一样

当我们尝试复制unique_ptr(例如,将一个唯一指针分配给另一个)时,我注意到错误是ErrorC2280std::unique_ptr#includeintmain(){std::unique_ptra=std::make_unique(2);std::unique_ptrb=a;}没关系,因为unique_ptr没有定义复制构造函数。您不会从唯一指针进行复制以在它们之间move(转移指针的所有权)。有趣的是(好吧,也许不是),这段代码抛出了同样的错误。现在我知道它是无效的(我将第一个unique_ptr声明为不可变对象(immutable对象)),但错误消息暗示它正在尝试调用复制

c++ - 将 Assets 目录从源复制到 CMake 中的构建目录

我正在尝试用C++编写一个练习游戏。我为此使用CMake,我的项目由我的IDE自动构建在一个单独的构建目录中。但是,我的assets文件夹没有被复制到新目录。目前,我正在尝试通过以下方式解决此问题:add_custom_command(TARGET${PROJECT_NAME}POST_BUILDCOMMANDcp-r${PROJECT_SOURCE_DIR}/assets${CMAKE_BINARY_DIR})但是,这似乎对结果完全没有影响,Assets目录仍然不出现在我的构建目录中。我怎样才能真正让它把这个Assets目录复制到我的构建位置?有没有一种更聪明的方法可以将我的程序指向