草庐IT

c++ - 如何以及为什么可以更改成员的访问级别?

我昨天结束了(在一些帮助下)这样的编码:#includeusingnamespacestd;classA{public:virtualvoidfoo(){cout(this));}};我尝试改变继承方式:classB:publicA{private:virtualvoidfoo(){coutfoo();}这仍然有效。我预计会出现编译时错误。请告诉我为什么这是可能的以及可能的用途是什么?由于第一种情况,我知道一种用途-您可以为不同的类公开不同的接口(interface)。编辑:在第二种情况下,输出是B::foo。 最佳答案 using

c++ - 带省略号的函数重载

我真的可以像这样使用函数重载吗:#includevoidfoo(...){std::cout关于它的标准是什么?在什么样的情况下我会得到::foo(...)? 最佳答案 voidfoo(int)将接受一个int类型的参数。voidfoo(...)接受任意数量、任意类型的参数。当调用没有单个int参数时,它将被选中。一般来说,用处不大。另请注意,将类类型的对象传递给...是未定义的行为。 关于c++-带省略号的函数重载,我们在StackOverflow上找到一个类似的问题:

c++ - 等待多线程(Posix 线程,c++)

考虑以下情况:我有一个被多个线程使用的对象foo,它可能会也可能不会重复调用foo上的方法bar()。bar()被并行执行多次是完全没问题的(也是理想的),因为它永远不会改变foo的状态。当我需要从外部(从另一个线程,而不是从“工作”线程之一)更改foo的状态时,问题就出现了——我如何以某种方式锁定foo,以便调用线程阻塞直到最后一个工作线程是用bar()完成的,所有工作线程都将在bar()处阻塞,直到我再次释放foo?很明显,我不能只使用在执行bar()期间保持锁定的互斥量,因为那样我就没有并发性了。有什么想法吗?或者对于这些类型的问题是否有更好的设计?

c++ - 将已编译的 .res 文件与 CMake 链接

我正在尝试将已编译的.res文件与cmake链接,但我似乎无法找到有关如何执行此操作的太多信息。我得到的最接近的是SET(RESOURCE_FILEresource.res)file(GLOBsrc_files"src/*.h""src/*.cpp""${RESOURCE_FILE}")add_executable(exename${src_files})然后通过IDE手动链接.res文件(即在visualstudio中将.res文件放入链接器附加依赖项中)。这意味着我每次更改cmake文件时都必须重置附加依赖项。当然有比这更好的方法请原谅我对cmake的经验不足,我们将不胜感激。

c++ - 存储非拥有引用的对象,在销毁引用之前必须通知该引用

我有一个遵循这种模式的类(class):classFoo{public://CreateaFoowhosevalueisabsoluteFoo(intx):other_(0),a_(x){}//CreateaFoowhosevalueisrelativetoanotherFooFoo(Foo*other,intdx):other_(other),a_(dx){}//Getthevaluedoublex()const{if(other_)returnother_->x()+a_;elsereturna_;}private:Foo*other_;inta_;};Foo对象都属于Bar:cl

c++ - 在 1_54 中破坏了 boost 变体?

我认为Boost::variant在1_54中被破坏了。我正在尝试将std::unique_ptr用作boost变体中的有界类型。根据1_54文档,变体需要可复制构造或可移动构造。http://www.boost.org/doc/libs/1_54_0/doc/html/variant/reference.html所以我在我的代码中实现了移动构造函数并禁用了复制构造函数。当我尝试将某些内容分配给变体对象时,它无法编译。我尝试了各种不同的方法,包括使用std::move将数据分配给变体对象,但似乎没有任何效果。根据编译错误堆栈跟踪,我确定问题出在variant.hpp中,它试图备份rhs

c++ - 返回类型更改时如何弃用函数 C++

当函数的返回类型需要改变时,有什么策略可以弃用函数?例如,我有:BadObjectfoo(int);//Oldfunction:BadObjectisbeingremoved.Objectfoo(int);//Newfunction.Object和BadObject在内部非常不同,交换它们的返回类型会破坏我库的当前用户的代码。我的目标是避免这种情况。我可以标记BadObjectfoo(int)deprecated,并给用户时间来更改受影响的代码。然而,我can'toverloadfoobasedonreturn-type.foo的命名很好,不需要额外的参数。我怎样才能将新功能添加到我的

c++ - 函数重载 - 定义顺序

我正在尝试创建一个有一些复杂的库resolve函数,调用一个简单的foo功能。resolve函数应该适用于foo的任何类型重载了。foo库中提供的适用于一些基本类型,但我希望用户能够提供自己的重载版本foo可用于resolve.这是一个非常简短的例子://INTHELIBRARY#includevoidfoo(inti){std::coutvoidresolve(Targ){//somecomplexcomputationfoo(arg);//somemorecomplutation}//INTHEUSERCODEvoidfoo(constchar*c){std::cout问题是,fo

c++ - C/C++ API 谜题

这是anearlierquestion的完全重写版本;我认为第一个版本省略了重要的细节;这一个提供了所有上下文。我有一些C++API的header。API声明了几个这样的类:classFoo{public:inlinevoidBar(void);/*moreinlines*/private:inlineFoo();/*maybemoreinlineconstructors*/}即没有成员,所有函数都是内联和公共(public)的,构造函数除外。构造函数是私有(private)的,因此,据我了解C++,我不能真正调用它们。要创建这些对象,我应该对它们使用auto_ptr:classFoo

c++ - 依赖于参数的查找——何时完成,搜索什么,以及如何强制(或阻止)它?

我无法理解参数相关(Koenig)查找背后的规则。考虑下面的代码:#includeusingnamespacestd;namespaceadl{structTest{};voidfoo1(Testconst&){coutfoo1(Tconst&){coutvoidoperator()(Tconst&)const{coutvoidfoo2(Tconst&){cout它的输出是:ADLnotused(foo1)ADLused(foo2)ADLnotused(foo3)我原以为他们所有人都会使用ADL,但令我惊讶的是只有一部分人这样做了。ADL规则背后有哪些(我知道可能很血腥)细节?我对这个