gpt4 book ai didi

C++设计查询

转载 作者:太空宇宙 更新时间:2023-11-04 14:19:33 24 4
gpt4 key购买 nike

我正在用 c++ 设计一个框架,它应该提供基本功能并充当其他派生系统的接口(interface)。

#include <stdio.h>

class Module
{
public:
virtual void print()
{
printf("Inside print of Module\n");
}
};
class ModuleAlpha : public Module
{
public:
void print()
{
printf("Inside print of ModuleAlpha\n");
}
void module_alpha_function() /* local function of this class */
{
printf("Inside module_alpha_function\n");
}
};
class System
{
public:
virtual void create_module(){}
protected:
class Module * module_obj;
};
class SystemAlpha: public System
{
public:
void create_module()
{
module_obj = new ModuleAlpha();
module_obj->print(); // virtual function, so its fine.

/* to call module_alpha_function, dynamic_cast is required,
* Is this a good practice or there is some better way to design such a system */
ModuleAlpha * module_alpha_obj = dynamic_cast<ModuleAlpha*>(module_obj);
module_alpha_obj->module_alpha_function();
}
};

main()
{
System * system_obj = new SystemAlpha();
system_obj->create_module();
}

编辑代码使其更符合逻辑并立即编译。问题是,是否有更好的方法来设计这样的系统,或者 dynamic_cast 是唯一的解决方案。此外,如果有更多的派生模块,那么对于类型转换,基类 Module 类中需要一些智能。

最佳答案

如果 DerivedBase 的唯一具体实例,您可以改用 static_cast

就个人而言,我为每个专门的类定义了一个函数,例如 MyCast。我定义了四个重载变体,以便我可以向下转换 const 和非常量指针和引用。例如:

  inline Derived       * MyCast(Base       * x) { return static_cast<Derived *>      (x); }
inline Derived const * MyCast(Base const * x) { return static_cast<Derived const *>(x); }
inline Derived & MyCast(Base & x) { return static_cast<Derived &> (x); }
inline Derived const & MyCast(Base const & x) { return static_cast<Derived const &>(x); }

对于 Derived2 和 Base2 也是如此。

同时拥有这四个的最大优势是您不会意外更改常量,并且无论您有指针还是引用,都可以使用相同的结构。

当然,你可以将static_cast替换成一个宏,在debug模式下使用dynamic_cast,在release模式下使用static_cast

此外,上面的代码可以很容易地包装成一个宏,使得批量定义函数变得容易。

使用此模式,您可以将代码实现为:

class Derived : public Base
{
public:
virtual void func2()
{
base2_obj = new Derived2();
}
void DerivedFunc()
{
MyCast(base2_obj)->Derived2Func();
}
}

关于C++设计查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8710567/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com