草庐IT

C++多态和虚函数

是否可以从B调用虚函数foo(int)而无需使用注释中的内容?classA{public:virtualvoidfoo(char*){}virtualvoidfoo(int){}};classB:publicA{public:voidfoo(char*){}//voidfoo(inti){////A::foo(i);//}};Bb;b.foo(123);//cannotconvertargument1from'int'to'char*' 最佳答案 是的,这是可能的。这里的问题是函数B::foo(char*)隐藏继承函数A::foo(

c++ - 防范函数名隐藏类名的危险

#includeusingnamespacestd;#include"other_library.h"structFoo{Foo(){cout这输出class,或者我们认为的那样。问题是,如果other_library.h恰好有一个名为Foo的函数,其返回类型适合出现在我们使用Foo的任何表达式中然后它默默地改变行为,例如:intFoo(){cout导致func在main中没有任何代码更改的情况下输出。这很糟糕,因为可能存在隐蔽且难以检测的错误;即使other_library并非出于恶意,名称冲突也可能不会被发现。处理这个问题的好方法是什么?它最初是由DanSaks提出的in1997,

c++ - 委派构造函数问题——安全吗?

这code在一个ctor中调用另一个ctor:#includeusingnamespacestd;classF{public:F(){cout结果是:ctor2ctor11dtor2dtor好像这里的成员变量f被销毁了两次,可以吗? 最佳答案 这里Foo(inti){Foo();cout您没有使用委托(delegate)构造函数。您正在做的是在构造函数主体中创建Foo的临时实例(并立即销毁它)。委托(delegate)构造函数的正确语法是Foo(inti):Foo(){cout 关于c+

c++ - 关于 vector 的内存行为的问题

最近我对std::vectors的内存(取消)分配有点困惑假设我得到了整数的法线vector:std::vectorintv;当我push_back一些int它随着时间的推移而增长。当我离开函数的范围(即)时,它会在不需要额外调用的情况下被释放。太棒了。让我们再举一个例子:structfoo_t{std::stringbar:unsignedintderp;}voidhurr(){std::vectorfoov;foo_tfoo;foo.bar="Sup?";foo.derp=1337;foov.push_back(foo);}好的。当我调用hurr()vector被创建,一个foo_

c++ - 是否保证在 std::string 之前初始化指向字符串文字的指针?

//file1.cppexternconstchar*foo;std::stringbar=foo;//file2.cppconstchar*foo="foo";标准保证bar被初始化为"foo"吗?或者它是否可以在foo被设置并在构造函数中出现段错误之前初始化,即SIOF的情况? 最佳答案 常量初始化保证首先发生(在这种情况下为foo)。所以Isbarguaranteedbythestandardtobeinitializedto"foo"?是的。Orcoulditbeinitializedbeforefoogetssetands

c++ - std c++ 容器元素销毁和插入行为

我做了以下小程序:(基本上是一个检查它是否被创建、复制或销毁的类,以及一个执行其中一些操作的主类)classFoo{public:Foo(stringname):_name(name){coutv1,v2;system("PAUSE");v1.push_back(albert);system("PAUSE");v2.push_back(bert);system("PAUSE");v1=v2;system("PAUSE");}system("PAUSE");}输出看起来像这样:InstanceAlbertofclassFoocreated!InstanceBertofclassFoocr

C++ 链接器 - 缺少重复符号

为什么下面的代码没有给我Impl的重复符号链接(symboliclink)器错误?我在继承的一些代码中遇到了这个问题,为了简单起见,我在这里重新创建了一个较短的版本。我有两个类,Foo和Bar,每个类都在各自的.cpp文件中定义相同结构(Impl)的不同版本。所以Foo.cpp和Bar.cpp每个都有一个同名的Impl定义,但每个都有不同的内联构造函数实现。Foo和Bar都有一个Impl类型的成员变量,并且每个forward都在其.h文件中声明了Impl。Foo.cpp在其构造函数中传递一个Bar实例。有趣的是,创建的内容取决于文件链接的顺序。所以这个编译命令:g++-oa.outma

c++ - OpenCV 摆脱了分配给 const 引用的麻烦?

我在openCV源代码中偶然发现了这段代码(cxoperations.hpp,第1134行,在Vector类的定义中):Vector(constVector&d,constRange&r){if(r==Range::all())r=Range(0,d.size());//somemorestuff...}请注意,Vector类没有名为r的数据成员(实际上,标识符r仅出现在整个类定义,作为另一个方法中的参数)。很显然,那是对const引用的赋值。我试图重现一个最小的例子:#includeclassFoo{public:int_a;Foo(inta):_a(a){}};intmain(){

c++ - "end()"后插入器的迭代器?

对于诸如从std::back_inserter()返回的那些迭代器,有什么东西可以用作“结束”迭代器吗?起初这似乎有点荒谬,但我有一个API是:templatevoidfoo(InputIteratorinput_begin,InputIteratorinput_end,OutputIteratoroutput_begin,OutputIteratoroutput_end);foo对输入序列执行一些操作,生成输出序列。(foo知道谁的长度,但可能等于也可能不等于输入序列的长度。)采用output_end参数是奇怪的部分:例如,std::copy不会这样做,并假设您不会通过它垃圾。foo

c++ - std::unordered_set<Foo> 作为类 Foo 的成员

我正在编写一个类,该类具有自己类型的unordered_set作为成员。因此我需要为hash编写特化.这个特化需要在声明Foo之后定义。但在我看来,好像我已经需要hash的特化了。在定义成员之前unordered_set.至少它不会编译并在那里失败。我尝试了哈希模板的前向声明,但也无法使其正常工作。相关代码片段为:classFoo{public:inti;std::unordered_setdummy;Peer(std::unordered_set);};namespacestd{templatestructhash{size_toperator()(constFoo&f)const{