草庐IT

基于 C++ 组件的类

你好,我正在编写一个带有容器的基于组件的类,但在考虑了许多不同的方法之后,我找不到真正符合我想要的方法。这里是一个总体思路的例子:还有我已经写的代码://AbstractclassComponentclassComponent{public:virtual~Component()=0;virtualintGetResult()=0;};classAddComponent:Component{public:intGetResult(){returninput1->GetResult()+input2->GetResult();}voidSetInput1(Component*c){inp

c++ - 无法理解 C++ 中的类定义

我是基于磁盘的R树的新手,尽管我编写了基于主内存的R树。为了理解基于磁盘的R-Trees,我使用了库“libspatialIndex”。在了解库时,我遇到了类的奇怪定义,如下所示:classSIDX_DLLIStorageManager{public:virtualvoidloadByteArray(constid_typeid,uint32_t&len,byte**data)=0;virtualvoidstoreByteArray(id_type&id,constuint32_tlen,constbyte*constdata)=0;virtualvoiddeleteByteArray

c++ - 如何创建一个仅在其类型具有特定成员函数时才编译的类?

我有一个名为has_f的类,我希望它只接受具有f成员函数的模板参数。我该怎么做?这是我尝试过的:templatestructhas_f:std::false_type{};templatestructhas_f::type>:std::true_type{};但是我遇到了一些神秘的错误。这是我要使用的类:structA{voidf();};如何正确执行此操作?谢谢。 最佳答案 从你的问题的标题来看,我认为你并不真的需要从true_type或false_type派生的类型-只是为了在方法f不存在时阻止编译。如果是这种情况,并且如果您还

c++ - 如何继承带有模板的类?

这个问题在这里已经有了答案:Accessinginheritedvariablefromtemplatedparentclass[duplicate](2个答案)WhydoIhavetoaccesstemplatebaseclassmembersthroughthethispointer?(3个答案)关闭8年前。为什么下面的工作正常:classa{public:intn;};classb:publica{public:b(){n=1;}};intmain(){}但这不起作用:templateclassa{public:intn;};templateclassb:publica{publ

c++ - Liskov 替换原则和游戏的类设计

在我的游戏中我定义了一个Screen类,其中包含对多个视觉对象的引用Entity可能被绘制到显示器上的对象:classScreen{public:private:std::vectorentities_;};全部Entity的,有一个Draw()功能:classEntity{public:voidDraw();private:intxpos;intypos;};Screen负责调用Draw()在其每个Entity上运行问题是一些(但不是全部)Entity的也需要是可更新的,即随着时间的推移,它们会改变它们的外观/位置。Screen还需要调用Update()函数但仅适用于那些可更新的对象

c++ - 如何为 friend 函数中定义的类授予友元?

这个问题是不言自明的,但如果需要的话,这里有一个例子:假设我有一个带有私有(private)构造函数的类“Thing”,它是一个函数“make_thing”的friend:classThing{friendstd::shared_ptrmake_thing();Thing(){std::cout“make_thing”函数内部定义了一个结构:std::shared_ptrmake_thing(){//err:Thing::Thing()isprivatewithinmake_shared//autothing=std::make_shared();//thisisokaystructA

c++ - 不同命名空间下相同结构的类之间的转换

假设我在命名空间AAA下有一个类A,其定义如下:namespaceAAA{classA{intx;std::vectory;A*ptr;};}我还有另一个类B,其结构与下面相同,但它位于不同的命名空间BBB下,namespaceBBB{classB{intx;std::vectory;B*ptr;};}我知道做到这一点的正确方法是首先只有一个定义,但现在假设我们不能改变这样一个事实,即有一个AAA::A类和一个BBB::B类。有什么方法可以将A对象转换为B对象? 最佳答案 没有任何安全转换。最好的是static_assert(siz

c++ - 将具有 unique_ptr 的类的构造函数作为成员复制到抽象类

我有一个类(C),它有一个vector的unique_ptr到一个抽象类(A)作为成员(member)。这是因为C必须与A类型的所有类一起工作,即它的子类。问题是我不知道如何为C编写复制构造函数,因为指针指向的对象的类型在编译时是未知的。在我看来这实际上是不可能的。任何人都可以确认这是不可能的吗?你对如何解决这个问题有什么建议吗?有一个没有复制构造函数的类是不是太糟糕了? 最佳答案 你没有说你是否控制抽象类和从它派生的类的代码。如果这样做,那么最简单的方法是在抽象类中提供一个纯虚方法Clone并在派生类中实现它。此方法应处理创建正确

c++ - 为继承 enable_shared_from_this 的类获取 unique_ptr

通常我更喜欢从工厂返回unique_ptr。最近我遇到了为继承enable_shared_from_this的类返回unique_ptr的问题。此类的用户可能会意外调用shared_from_this(),尽管它不属于任何shared_ptr,这会导致std::bad_weak_ptr异常(或C++17之前的未定义行为,通常作为异常实现)。代码的简单版本:classFoo:publicenable_shared_from_this{stringname;Foo(conststring&_name):name(_name){}public:staticunique_ptrcreate(c