【问题标题】:Class system architecture in C ++C++中的类系统架构
【发布时间】:2021-11-26 01:11:50
【问题描述】:

对于我的最新项目,我有一门课

class Parent {
    public:
        // class constructor
        Parent();
        
        // member function
        double fun(double x)
};

和另一个班级

class Child {
    private:
        int type;
    public:
        // class constructor
        Child(int itype);
};

我知道我可以通过指定class Child : public ParentParent 继承函数,以便我的类child 的实例可以调用fun。但是,我希望函数fun 根据type 执行不同的计算。例如,如果我的Child 类的实例由Child nChild(1); 初始化,则调用nChild.fun(5) 应返回5 的平方根,而通过Child nChild(2); 初始化类时,调用nChild.fun(5) 应返回对数5 等等。

如何设计一个具有依赖关系的类系统,使父类中的函数依赖于子类的值?这是否有意义,或者通常建议不要使用这种架构?请注意,我不是 C++ 专家。

【问题讨论】:

  • 阅读关键字virtual 以及它如何应用于函数。
  • 程序运行时成员变量类型可以取任何值,但类层次结构必须在编译时完全定义。所以你不能让类层次结构以某种方式依赖于变量的值。
  • 也许您想创建一个像“Parent * createObject(int itype);”这样的工厂函数,它根据“itype”的值分配并返回不同子类的对象?然后,您可以将“double fun(double x)”设为虚拟,并在您定义的每个不同子类中以不同方式实现它。
  • 是否有任何理由不能在父级中使用单独的函数,例如平方根和对数,而不是通过代码进行调度?
  • 可能不使用int,而是使用需要对值执行操作的类?您将type 绑定到一个数字,但是当您可以传递一个包含所有信息的类时,为什么要这样做,包括对值执行的函数。如果您以这种方式做事,我什至看不到Parent 的必要性,除非我遗漏了什么。

标签: c++ class


【解决方案1】:

您可以在父类中保留protected: int myType;,并在派生类中使用它来打开。然而,更好的设计是为每种类型创建一个不同的派生类,以覆盖fun() 方法。

class Parent
{
public:

    Parent();

    virtual double fun(double x) = 0;
};

class ChildLog : public Parent
{
public:
    ChildLog();
    double fun(double x)
    {
        // return log(x)
    }
};

class ChildSqrt : public Parent
{
public:
    ChildSqrt();
    double fun(double x)
    {
        // return sqrt(x)
    }
};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-17
    • 2022-08-20
    • 2010-10-04
    • 2010-09-09
    • 1970-01-01
    • 2020-02-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多