在C++中提供一个接口(interface)的最优雅的方法是什么,该接口(interface)接受派生类类型,这些派生类类型带有不同的数据类型成员,然后需要稍后检索这些成员。下面的示例说明了这一点,其中Container类提供了“发布”Item的方法,该Item将是BaseItem的某种派生变体。稍后我想取回派生的Item并提取其值。我想要的主要是容器接口(interface)(发送和接收)在未来保持不变,同时允许定义不同的“项目”派生类型并通过它“传递”。不知何故,模板会更好吗?我宁愿不使用RTTI。也许对此有一些简单、优雅的答案,但现在我正在努力想它。classItemBase{/
我真的不知道如何描述这个,但这是代码:classA:publicstd::vector{};//....Aa;a.push_back(a);它有什么作用,你为什么要这样做? 最佳答案 这是curiouslyrecurringtemplatepattern(CRTP).它允许您实现静态多态性。但是,将std::vector用作基类是一种不好的做法,因为它没有虚析构函数。 关于c++-一个类怎么可能从专门针对自身的模板派生出来呢?,我们在StackOverflow上找到一个类似的问题:
如果类X派生自类Y且类Y具有以下任何一种:用户声明的复制构造函数,用户声明的复制赋值运算符,用户声明的析构函数用户声明的移动构造函数,用户声明的移动赋值运算符,如果类X未声明上述任何一项,移动构造函数和移动赋值运算符是否会隐式默认?例如structY{virtual~Y(){}//....stuff};structX:publicY{//...stuffbutnodestructor,//nocopy/moveassignmentoperator//nocopy/moveconstructor//willXhaveadefaultmoveconstructor/assignmentop
观察下面的程序:#include__FILE__main(){}预处理器陷入无限递归,包括自身内部的拷贝,并提示main()已经被定义。如果我可以使用宏来包含文件,我可以根据__FILE__导出文件名并包含它吗?例如,我想在"foo.cpp"中包含"foo.h",但它是从__FILE__.##将连接宏。也可以Stringify宏。可以用预处理器来完成吗? 最佳答案 C标准指定了三种形式的#include:#include#include"file"#includeANYTHINGELSE在前两种情况下,没有发生宏扩展,因此无法改变行
我经常使用C++RADStudio和Builder6,并且在编写非可视化代码时经常动态创建表单或动态创建非可视化组件。在设计表单时,拖放到该表单上的组件的Owner属性会自动设置,因此我从不担心。但是,在动态创建从TComponent派生的任何内容时,我总是将NULL作为Owner参数传递,因为我总是负责稍后释放内存。Borland/Embarcadero文档并没有真正涵盖动态创建事物的情况下所需的内容(或者也许我没有在正确的地方寻找)并且似乎只涵盖了基于设计时表单的场景。我想知道为动态创建的组件传递一个NULL所有者是否是正确的做法,或者它是否会导致稍后会出现的内部问题。代码编译和工
大多数C++程序员都知道空基类优化是technique/idiom.空子类会怎样?例如classEmptyBase{inti;};templateclassDerived:T{};std::cout);//Isthereastandardverdiconthis?与EBO类似,应该有一个EDO声明因为派生类不提供任何更多成员,也不向其参数化类型引入任何虚拟成员,它不应该需要更多内存。考虑到可能出现类似情况的各种情况(多重继承、单一继承......):这样的优化标准/可能吗?如果是,这种优化的机制是什么,它们是否类似于EBO's?注意:使用派生自其参数化类型的类模板是相当典型的。主题是关
假设我有以下代码#include#include#includestructFooBase{voidstart(){run_condition_=true;t_=std::thread([this](){thread_handler();});}virtual~FooBase(){run_condition_=false;if(t_.joinable())t_.join();}protected:virtualvoidthread_handler()=0;std::atomic_boolrun_condition_{false};private:std::threadt_;};stru
我还是C++的新手,遇到了一个问题,我似乎无法将新的派生类插入到映射中。我的代码简化如下:std::map>m;voidfunc(){for(intnum=0;num这给了我这个:error:nomatchingfunctionforcallto'std::pair>::pair(int&,Derived_Class*)我试过不成功:m.emplace(std::pair(num,newDerived_Class()));这给了我这个:error:nomatchingfunctionforcallto'std::pair>::pair(std::pair)我似乎无法弄清楚这一点,如果有
我有一些代码需要优化。它看起来像这样:functionabc(stringformat){if(format=="a"){//thisisastring,Ishouldn'thaveusedsinglequote,sorryfortheconfusionclassx::at;doit(t);}if(format=="b"){classx::bt;doit(t);}if(format=="c"){classx::ct;doit(t)}if(format=="d"){classx::dt;doit(t);}}目前有很多不同类型的doit()函数functiondoit(classx:a){
我想在派生类中将基类中的公共(public)成员设为私有(private),如下所示:classA{public:intx;inty;};classB:publicA{//xisstillpublicprivate://yisnowprivateusingy;};但显然“using”不能那样使用。有没有办法在C++中做到这一点?(我不能使用私有(private)继承,因为A的其他成员和函数必须仍然是公共(public)的。) 最佳答案 是的,使用声明技术上允许您这样做。你必须使用usingA::y而不是usingy但是请认真评估这样