草庐IT

c++ - 按值(value)传递和不同的行为

为什么以下代码在使用gcc4.7.2和MSVC-11.0编译时会给出不同的输出?#includeclassBase{public:Base(){std::cout海湾合作委员会4.7.2Base::Base()Derived::Derived()Base::~Base()Derived::~Derived()Base::~Base()MSVC-11.0Base::Base()Derived::Derived()Base::~Base()Base::~Base()为什么MSVC-11.0不打印第二个Derived::~Derived()?https://ideone.com/NF9FQf

c++ - C++ 中更简单的 "Preventing derived classes"

Bjarne假设有正当理由阻止从某个类派生,给出了一个解决方案here对于“我可以阻止人们从我的类(class)派生吗?”的答案不过,我想到了:classfinal{protected:final(){}//line3};classB:privatevirtualfinal{};classD:publicB{//line9};intmain(){Bb;Dd;//line14}尝试编译时,会得到:foo.cpp:Inconstructor‘D::D()’:foo.cpp:3:error:‘final::final()’isprotectedfoo.cpp:9:error:withinth

c++ - 是否可以使用 CRTP 模拟静态多态性中的纯虚函数?

我正在尝试使用CRTP实现编译时多态性,并希望强制派生类实现该功能。目前的实现是这样的。templatestructbase{voidf(){static_cast(this)->f();}};structderived:base{voidf(){...}};在此实现中,如果派生类未实现f(),则对该函数的调用将陷入无限循环。如何强制派生类像纯虚函数一样实现函数?我尝试使用像static_assert(&base::f!=&Derived::f,"...")这样的“static_assert”,但它生成一条错误消息,指出两个成员函数指针指向不同的类的成员函数没有可比性。

c++ - 具有平凡构造函数的派生类的统一初始化

我正在尝试使用C++11统一初始化解决一些极端情况,但我无法弄清楚这是为什么:structBase{intx,y,z;};structDerived:Base{};static_assert(std::is_trivial::value,"Basemustbetrivial");static_assert(std::is_trivial::value,"Derivedmustbetrivial");Baseb{1,2,3};//1)ThiscompilesfineDerivedd{10,20,30};//2)Thisfails标记为2的行因clang3.1和g++4.7均出现“没有匹配

c++ - 成员(member)检测代码说明

这不是整个概念,而是它用来确定类是否具有n数据成员的方法之一。这是完整的代码;SFINAE用于成员检测的普通用法。templatestructhas_X{structFallback{intX;};structDerived:T,Fallback{};templatestructS;templatestaticchar(&f(S*))[1];templatestaticchar(&f(...))[2];public:conststaticboolvalue=sizeof(f(0))==2;};Derived继承自Fallback和T的部分让我感到困惑,因为当我们重载f,&C::X是&D

c++ - 继承构造函数和大括号或等于初始值设定项

我不明白为什么你不能编译一个类,它既有一个成员(不是默认可构造的),也有一个大括号或相等的初始值设定项和一个继承的构造函数。g++说:test.cpp:22:15:error:useofdeletedfunction‘Derived::Derived(float)’Derivedd(1.2f);test.cpp:16:13:note:‘Derived::Derived(float)’isimplicitlydeletedbecausethedefaultdefinitionwouldbeill-formed:usingBase::Base;test.cpp:16:13:error:no

c++ - 如何设计一个基类,使其在运行时知道所有 "derived"类?

通常,如果您事先知道要创建的所有类型,就可以这样做:typedefenum{BASE_CREATURE_TYPE=0,ANIMAL_CREATURE_TYPE,...}CREATURE_TYPES但这变得很乏味,因为每次创建新类时,都需要更新枚举。此外,CREATURE_TYPES仍然只是枚举中的项目-如何绑定(bind)到实际类?我想知道是否有某种方法,我可以只编写类,并在运行时创建一个包含所有类型的集合,而无需实际实例化对象。这在C++中可行吗?在Java中有一种叫做“静态block”的东西,它在JVM加载类时执行。编辑:这个问题与静态block无关——这只是一个例子——我想知道是

c++ - 抽象类作为接口(interface),没有 vtable

我想创建一个抽象类来定义类的一些方法。其中一些应该由基类(Base)实现,一些应该在Base中定义但被Derived覆盖,还有一些应该在Base中是纯虚拟的以强制在Derived中定义。这当然是抽象类的用途。但是,我的应用程序只会直接使用Derived对象。因此,编译器应该在编译时准确地知道要使用哪些方法。现在,因为这段代码将在RAM非常有限的微Controller上运行,所以我很想避免实际使用带有vtable的虚拟类。从我的测试来看,编译器似乎足够聪明,除非必须,否则至少在某些情况下不会创建vtable。然而,有人告诉我永远不要相信编译器:是否有可能将其作为编译的必要条件?下面是一些

c++ - 使用模板元编程计数?

一段时间以来,我一直在尝试为这个问题想出一个创造性的解决方案(开启和关闭),但我还没有做到。我最近认为它可能可以通过模板元编程来解决,但由于我相对缺乏该技术的经验,我不确定。是否可以使用模板元编程(或C++语言的任何其他机制)来计算从某个基类派生的类的数量,以便为每个派生类分配一个唯一的静态类标识符?提前致谢! 最佳答案 没有。这是一个在实践中经常出现的问题,据我所知只有两种解决方案:手动为每个派生类分配ID。以非确定性方式动态地延迟生成ID。你做第二个的方式是这样的:classBase{virtualintgetId()const

c++带有缩进的自定义输出流

我在尝试实现自定义流类以在输出文件中生成缩进代码时遇到了一些问题。我在网上进行了广泛搜索,但似乎没有就实现这一目标的最佳方式达成共识。有些人谈论派生流,其他人谈论派生缓冲区,还有一些人建议使用语言环境/方面等。基本上,我发现自己写了很多这样的代码:ofstreammyFile();myFile.open("test.php");myFile""Helloworld"""当标签开始加起来时,它看起来很恐怖,看起来像这样的东西看起来很不错:ind_ofstreammyFile();myFile.open("test.php");myFile""Helloworld"""即创建一个派生流类,