草庐IT

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

c++ - 每当使用 constexpr 指定调用的函数时,将委托(delegate)方法声明为 constexpr

请考虑以下类(class)templateclassfoo{public:autobar(){returnm_t.bar();}private:Tm_t;};如果我们想要foo::bar不抛出任何时候T::bar是非抛出的,我们可以将其声明更改为autobar()noexcept(noexcept(m_t.bar())){returnm_t.bar();}但如果我们想要,我们能做什么foo::bar用constexpr指定每当T::bar用constexpr指定?我们可以写吗constexprautobar()noexcept(noexcept(m_t.bar())){returnm_

c++ - 为什么在使用命名空间 foo 时不能在 sub::bar 中使用 foo::bar 函数?

考虑以下程序:namespacefoo{namespacesub{intf();}//namespacesub}//namespacefoonamespacebar{namespacesub{intg(){usingnamespacefoo;returnsub::f()+1;}}//namespacesub}//namespacebar我希望它能编译,但它没有:$g++-6-ca.cppa.cpp:Infunction‘intbar::sub::g()’:a.cpp:12:9:error:‘f’isnotamemberof‘bar::sub’returnsub::f()+1;^~~a.

c++ - 有没有办法将参数默认值设置为先前参数的函数? [C++]

我假设不是,但我只是想检查一下-在C++中是否有任何方法可以执行以下操作?显然,当我尝试下面的操作时,我得到了一个关于bar的基于范围的错误。voidfoo(Barbar,inttest=bar.testInt){...} 最佳答案 如果test的值无效,您可以检测到:voidfoo(Barbar,inttest=-1){//assuming-1isinvalidif(test==-1)test=bar.testInt;//...}如果没有,你总是可以使用重载函数:voidfoo(Barbar,inttest){//...}void