草庐IT

c++ - 绕过自动生成的赋值运算符(VS bug?)

采用以下代码:classFoo{Fooconst&operator=(Fooconst&rhs);//disallow};structBar{public:Foofoo;templateTconst&operator=(Tconst&rhs){returnrhs;}};structBaz:publicBar{usingBar::operator=;};intmain(){Bazb1,b2;b1=b2;}编译失败是因为将使用自动生成的Bar::operator=赋值运算符,它会尝试使用私有(private)的Foo::operator=。还行吧。所以我在Bar中添加了一个额外的成员:Ba

c++ - 无法重载对 *this 的引用

这是我为N2439(“this”的引用限定符)使用gcc-4.8.1+中的新功能(我认为clang-2.9+也应该这样做)编写的一个busybox:classFoo{public:Foo(inti):_M_i(i){}intbar()&{return_M_i/=2;}intbar()const&{return_M_i;}intbar()&&{return2*_M_i;}private:int_M_i=42;};intmain(){Fooph(333);ph.bar();constFooff(123);ff.bar();Foo(333).bar();}在阅读标准8.3.5时,我认为三个b

c++ - 带有仿函数修改对象的 const 函数

如果我们考虑以下方法,我的印象是bar不能修改this(即Foo的实例)。structFoo{inti;//varshallnotmodifytherespectiveinstanceofFoo,thus"const"voidbar(std::functionfunc)const{func(3);}};但是,以下是可能的:voidanothermethod(){Foof;f.bar([&](intx){f.i=3;});//modifyFoo.i"within"Foo::barconst.Dangerous?}我看到方法bar不是“直接”修改其实例的值i,而是通过给定参数“间接”修改函

c++ - GoogleMock:期待两个方法调用中的任何一个

我有一个Foo类,它引用多个其他IBar类型的对象。该类有一个方法fun,它需要至少在其中一个IBar上调用方法frob。我想用模拟的IBar编写一个测试来验证这个要求。我正在使用GoogleMock。我目前有这个:classIBar{public:virtualvoidfrob()=0;};classMockBar:publicIBar{public:MOCK_METHOD0(frob,void());};classFoo{std::shared_ptrbar1,bar2;public:Foo(std::shared_ptrbar1,std::shared_ptrbar2):bar1

c++ - 乱序初始化成员 - 这样可以吗?

来自对thisanswer的评论:类成员按照声明的顺序进行初始化。按照这个逻辑,下面的构造函数应该调用未定义的行为:structFoo{Bara;Barb;Foo(Barc):a(b=c){}};显然,我们在a初始化之前先分配给b。分配给未初始化的对象应该是UB。代码与Bar=int一起“工作”并不奇怪,但是如果我使Bar成为带有构造函数的重类,我会看到b确实在a之前初始化。(为了更疯狂,我们甚至可以说Foo(Barc,Bard):a(b=c),b(d){},仍然没有警告。)然而GCC4.6.1并未对此发出警告。这是可接受的、定义明确的行为,还是完全错误的?

c++ - 是否可以使用填充构造函数创建 std::vector<std::unique_ptr<Bar>> ?

我有一个Foo类,其成员变量类型为std::vector>,我想填写这个类的构造函数的初始化列表。这可能吗?我希望可以使用vector的填充构造函数,就像这样Foo::Foo(intn):vector>(n,unique_ptr(newBar)){}但我认为这需要std::unique_ptr的复制构造函数,它被删除了(因为它应该被删除)(unique_ptr(constunique_ptr&)=delete)。有没有更好的方法来解决这个问题? 最佳答案 既然不可复制,那就搬吧!硬编码对象的解决方案:#include#include

C++:如何提高经常被复制的自定义类的性能?

我正从Java转向C++,但我在理解C++类的工作原理和设计它们的最佳实践方面遇到了很多困难。具体来说,我想知道在以下情况下我是否应该使用指向我的类成员的指针。我有一个自定义类Foo,它表示特定回合的游戏状态,Foo有一个自定义类Bar的成员变量,它表示该游戏状态的逻辑子集。例如,Foo代表棋盘,Bar代表受到攻击的棋子及其逃跑Action(不是我的具体情况,而是我认为更普遍的类比)。我想通过复制Foo并相应地更新拷贝的状态来搜索一系列移动。当我完成搜索该移动序列时,我将丢弃该拷贝,并且仍然有代表当前游戏状态的原始Foo。在Foo.h中,我声明了我的Foo类,并为其声明了一个Bar类型

c++ - 在 C++ 中将未命名的临时变量括起来

考虑以下代码:structFoo{};structBar{explicitBar(constFoo&){}};intmain(){Foofoo;Barbar(foo);//Okay.Bar(foo);//Willnotcompile.(Bar(foo));//Okay.Unnamedtemporaryrequiresparenthesis.}为什么需要临时版本周围的括号?他们解决了什么歧义?我的直觉是:我认为编译器将Bar(foo)视为函数的声明,但我不确定为什么会这样,因为foo(实例)不是类型。因此,括号强制将上述内容视为表达式,而不是前向声明。 最佳答

java - SWIG 将生成的类从不同的模块和包导入当前类

我很难获得SWIGtypemap(javapackage)正常工作。我尝试制作一个简单版本的问题,但似乎也失败了。foo.h:#ifndefFOO_H#defineFOO_HclassFoo{public:Foo(){};intdoSomething(){return1};};#endifbar.h:#ifndefBAR_H#defineBAR_H#include"foo.h"classBar{public:Bar(){};intdoSomething(Foofoo){returnfoo.doSomething();};};#endifFoo.i%moduleFooMod%includ

c++ - 删除向上转换为基指针的对象数组

开始将一些库从msvc移动到mingw,并发现当有人想要删除一个arrayupcastedobjects时msvc的非常有趣的行为。即msvc做了一些黑魔法(它似乎喜欢这样做)并且波纹管代码执行得很好,但是在mingw中(4.7.2(崩溃。我相信mingw正在正确执行并且它的msvc巫术就是制作睡虫。代码:#includeclassfoo{staticintidgen;protected:intid;public:foo(){id=idgen++;std::coutmsvc2010的输出Hello(foo-0)Hello(bar-0)Hello(foo-1)Hello(bar-1)By