【问题标题】:Defining object of derived class in base class在基类中定义派生类的对象
【发布时间】:2022-01-10 10:10:09
【问题描述】:

我正在尝试用 C++ 编写代码并且是新手。 那么,有没有办法通过在基类之前预定义基类来在基类中定义派生类

class rect:public area{
   void rect();
};
class area
{
      public:
         int a,rl,rb,tb,th;
      void getdata()
      {
         cout<<"1.Calculate rectangle: ";
         cout<<"2.Calculate triangle: ";
         cout<<"Enter your choice: ";
         cin>>a;
         switch (a)
         {
         case 1:
            cout<<"Enter length";
            cin>>rl;
            cout<<"Enter breadth";
            cin>>rb;
            rect r;
             break;

派生类中的代码是

    class rect:public area
{
public:
   rect(){
      cout<<"The area of rectangle is:"<<rl*rb;

   }
};

但我似乎无法预定义基类,这是 c++ 中的限制还是代码中存在问题。

【问题讨论】:

  • 不,不能。另一方面,为什么矩形是从面积派生的?一个矩形不是一个区域,它可能一个区域。这表明该模型有些缺陷,您可能需要重新考虑它。大多数情况下,基类定义了一个带有派生类可以实现的虚函数的接口。
  • @kiner_shah 不要盲目地模仿其他评论者(所以它并没有变得更好)。在这种情况下,不需要最小的可编译示例。 OP 试图创建一个循环继承依赖(从他的例子中可以清楚地看出),这样的依赖是不可能的。
  • 您的 C++ 知识似乎存在一些空白,您应该在参考书中查找:forward declaration,在类定义之外定义成员函数,以及数据封装(在这种情况下:它是基类知道派生自它的特定类通常是糟糕的设计)。你想做的事情可以做,但也许你不应该做。当心恐龙!
  • 嗯...我想一个问题是您将代码扔给我们并希望我们弄清楚代码的用途。当您的代码没有按照预期执行时,这将成为一个猜谜游戏。馊主意。您应该为您的代码编写规范,并将它们添加到问题中。你的每个类应该封装什么概念? getdata()的作用是什么,为什么是area的成员?你希望通过定义一个变量然后什么都不做(rect r;)来完成什么? 让您的示例代码更简单可能会更容易编写这些规范。

标签: c++ inheritance


【解决方案1】:

继承应该用于“is a”关系,组合用于“has a”关系。你能说一个矩形“是一个”区域吗?不,一个矩形“有一个”区域。所以正确的方法是有一个class rect,它有一个包含或返回矩形区域的成员变量或函数。

但是,您可以说矩形“是”形状,并且每个形状都有一个区域。那么你先创建一个class shape,然后定义一个virtual函数来获取它的面积:

class shape {
    public:
    virtual float get_area() const = 0;
    ...
};

然后像这样从shape 导出class rect

class rect: public shape {
    public:
    float get_area() const override {
        return length * breadth;
    }
    ...
};

至于get_data(),这应该是一个独立的函数,而不是任何类的成员。

【讨论】:

  • “你能说矩形'是一个'区域吗?” -- 可以,前提是“区域”被用作“区域”的同义词,而不是“区域”的同义词一个测量。 (Wiktionary's definition 的意思是“任何特定的表面范围”。)考虑到测量具有相同的名称,这不是命名法的最佳选择,但在我看来,定义一个表示测量的类更加奇怪。跨度>
猜你喜欢
  • 1970-01-01
  • 2020-03-17
  • 1970-01-01
  • 1970-01-01
  • 2012-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-10
相关资源
最近更新 更多