【问题标题】:How to create an array of pointers to object of a inherit class如何创建指向继承类对象的指针数组
【发布时间】:2020-04-10 16:31:59
【问题描述】:

考虑下面的代码

class Shape
{
protected:
    int length, height;
public:
    Shape();
    ~Shape();
};

class Square : Shape
{
private:
    double Area;

public:
    Square();
    ~Square();
};

class Circle : Shape
{
private:
    double Circumference;

public:
    Circle();
    ~Circle();
};
int main() 
{

    Shape *shape[5];
    int choice, i = 0;

    cout << "Which shape are you making?\n";
    cout << "1. Square\n";
    cout << "2. Circle\n";
    cin >> choice;

    if (choice == 1)
    {
        shape[i] = new Square();
        i++;
    }

    if (choice == 2)
    {
        shape[i] = new Circle();
        i++;
    }


}

如何创建一个包含 Circle 和 Squares 的指针数组,以便我以后可以轻松访问这两个指针来处理它?目前,它在 main() 中的 shape[i] = new Square();shape[i] = new Circle(); 中给我一个错误,我不知道如何创建一个指向继承类的指针数组。

【问题讨论】:

    标签: c++ arrays class pointers


    【解决方案1】:

    你需要指定你想要什么样的继承;更具体地说,您需要告诉编译器它是public 继承,这意味着您的整个代码库都可以知道CircleSquareShape

    只需将类的声明更改为:

    class Circle : public Shape

    class Square : public Shape

    另外,考虑将Shape 作为一个真正的虚拟接口,这意味着 - 它应该只有每个形状应该具有的公共 API,例如:

    class IShape
    {
    public:
        virtual double get_area() const = 0;
        virtual double get_perimeter() const = 0;
        // and so on...
    
        virtual ~IShape() = 0;
    
    protected:
        virtual double calculate_something() const = 0;
        // also protected can be here
    };
    

    另外,请注意使用原始数组,尤其是原始指针的原始数组,例如:

    Shape *shape[5];

    是导致程序内存泄漏的好方法;在这种情况下,您应该同时使用 std::arraystd::unique_ptr&lt;IShape&gt;,这意味着您的 main 应该如下所示:

        std::array<std::unique_ptr<IShape>, 5> shape;
        int choice = 1;
        int i = 0;
    
        if (choice == 1)
        {
            shape[i] = std::unique_ptr<IShape>(new Square());
            i++;
        }
    
        if (choice == 2)
        {
            shape[i] = std::unique_ptr<IShape>(new Circle());
            i++;
        }
    

    【讨论】:

      【解决方案2】:

      这是因为您在指定继承时没有说明它是 public、private 还是 protected。默认情况下,c++ 会认为它是私有的,因此您不能访问私有类。将继承从私有更改为公共,您就可以开始了。 像这样的

      class Square :public Shape
      {
      private:
          double Area;
      
      public:
          Square();
          ~Square();
      };
      
      class Circle :public Shape
      {
      private:
          double Circumference;
      
      public:
          Circle();
          ~Circle();
      };
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-30
        • 2016-09-02
        • 1970-01-01
        • 2018-02-25
        • 2021-05-24
        • 1970-01-01
        相关资源
        最近更新 更多