草庐IT

c++ - 从枚举中获取所有值

我有Class1风格的类(见代码)。一个枚举和一个从枚举中获取所有值的函数。值(FOO_1、FOO_2等)因类而异,值的数量也不同(sizeof(Foos))。我调用该函数一次以获取枚举的大小,保留内存并在第二次调用中我想将所有值获取到*pFoos(2,1,6在示例代码中)。有没有比使用包含所有值的数组更好的方法(size_tarr[3]={FOO_1,FOO_X,FOO_BAR})?classClass1{enumFoos{FOO_1=2,FOO_X=1,FOO_BAR=6}};Class1::GetFoos(size_t*pFoos,size_t*pSize){size_tlen=

c++ - 在 C++ 中,我可以防止派生类被 friend 以外的类实例化吗?

在C++中,如果我有一个抽象基类,是否可以防止它的派生类被基类知道的friend以外的类实例化? 最佳答案 您可以将构造函数定义为私有(private)的,就像任何其他函数一样。例如:classfoo{friendfoo*FooConstructor(void);public:voidMethod();voidMethod2();private:foo();foo(const&foo);};foo*FooConstructor(void){returnnewfoo();}这可以防止以任何方式创建foo,使用FooContructor

c++ - 右值函数重载

我想重载一个函数,以便它以某种方式操纵它的参数,然后返回对参数的引用——但如果参数不是可变的,那么它应该返回一个被操纵的拷贝相反的论点。在弄乱它很长时间之后,这就是我想出的。usingnamespacestd;string&foo(string&in){in.insert(0,"hello");returnin;}stringfoo(string&&in){returnmove(foo(in));}stringfoo(conststring&in){returnfoo(string(in));}这段代码似乎可以正常工作,但我很想知道是否有人能想出更好的方法。这是一个测试程序:intma

c++ - 什么时候应该限制派生类中虚函数的可访问性?

考虑以下代码:classBase{public:virtualvoidFoo(){}};classDerived:publicBase{private:voidFoo(){}};voidfunc(){Base*a=newDerived;a->Foo();//fine,callsDerived::Foo()Derived*b=newDerived;//b->Foo();//errorstatic_cast(b)->Foo();//fine,callsDerived::Foo()}关于这个问题,我听到了两种不同的思想流派:保留与基类相同的可访问性,因为用户无论如何都可以使用static_c

c++ - 如何遍历一个 vector 中的所有子 vector ?

假设我有一个Foo类。它包含一个Foo类型的vector。如何编写一个循环来遍历foo中的vector并不断遍历子vector,直到我们达到其中一个vector为空的级别classFoo{Foo();std::vectorfoos;}我可以这样做来迭代它,但是我如何递归地迭代原始vector中foo对象中的vector,直到达到vector为空的级别?Foof;if(!f->foos.empty()){std::vector::const_iteratoritr;for(itr=f.foos.begin();itr!=f.foos.end();++itr){}}

c++ - 我可以在 C++ 中全局声明类对象吗?

classFoo{public:Foo(inta,intb);Foo();};Foofoo;intmain(){foo(1,3);}如果我使用全局类Foo,这是正确的做法吗?如果不是,请问哪种方法是正确的?注意:我想要全局类对象。 最佳答案 是的,您可以声明任何类型、类或非类的全局变量。不,您不能在函数内再次“调用”构造函数来初始化它。但是,您可以使用复制赋值运算符来执行此操作:Foofoo;intmain(){foo=Foo(1,3);}或者您可以使用“setter”函数来设置或重新初始化对象。顺便说一句,根据类中的数据,您可能想

c++ - 关于更改返回类型 C++ 的二进制兼容

我有一个关于二进制兼容性的问题。我有一个类A,它包括一个公共(public)方法foo()和一个属性字符串_foo;conststringfoo(){return_foo;}当我改成conststring&foo(){return_foo;}它仍然是二进制兼容的吗?感谢您的帮助! 最佳答案 Policies/BinaryCompatibilityIssuesWithC++:此处的目标是在编写跨平台C++代码时列出最严格的条件集,这些代码意味着可以使用多个不同的编译器进行编译。注意事项:...你不能……:以任何方式改变返回类型

c++ - 在构造函数中使用 setter

我是一名尝试学习C++的Java开发人员。是否可以在构造函数中使用setter以重用setter提供的健全性检查?例如:#includeusingnamespacestd;classTest{private:intfoo;voidsetFoo(intfoo){if(foofoo=foo;}public:Test(intfoo){setFoo(foo);};}; 最佳答案 是的,建议这样做,基本上是因为你已经提到的原因。另一方面,您应该问问自己是否需要setter而不是直接在构造函数中实现检查。我写这篇文章的原因是setter通常会导

c++ - 从 "foo<T>"转换为 "const foo<const T>"- C++

我有一个类似的函数(请不要关心通过引用返回临时值。这只是一个解释问题的例子),constfoo&get_const(){foof;returnf;}这显然无法编译。我正在寻找一种方法来确保调用者不会更改T的foo.我怎样才能确保这一点?我已经看到boost::shared_ptr的类似行为.shared_ptr可转换为constshared_ptr.我不知道它是怎么做到的。任何帮助都会很棒。 最佳答案 编译器看到foo和foo作为两种完全不同且不相关的类型,所以foo与任何其他转换一样,类需要明确支持这一点。如果您可以控制foo类,

c++ - 将 "this"转换为引用指针

假设我有一个结构structFoo{voidbar(){do_baz(this);}/*Seeeditbelowvoiddo_baz(Foo*&pFoo){pFoo->p_sub_foo=newFoo;//forexample}*/Foo*p_sub_foo;}GCC告诉我temp.cpp:Inmemberfunction‘voidFoo::bar()’:temp.cpp:3:error:nomatchingfunctionforcallto‘Foo::do_baz(Foo*const)’temp.cpp:5:note:candidatesare:voidFoo::do_baz(Foo