如何创建一个指向继承类对象的指针数组

时间:2020-04-10 16:31:59

标签: c++ arrays class pointers

考虑以下代码

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++;
    }


}

我将如何制作一个既包含圆形又包含方形的指针数组,以便以后可以轻松访问这两个指针以进行处理?当前,它给我main()的shape[i] = new Square();shape[i] = new Circle();中的错误,而且我不知道如何创建指向继承类的指针数组。

2 个答案:

答案 0 :(得分:0)

您需要指定所需的继承类型;更具体地说,您需要告诉编译器它是public的继承,即整个代码库可以知道CircleSquareShape。 / p>

只需将类的声明更改为:

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<IShape>,这意味着您的主体应如下所示:

    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++;
    }

答案 1 :(得分:0)

这是因为您在指定继承时没有告诉它是public,private还是protected。默认情况下,c ++会将其视为私有类,因此不允许您访问私有类。将遗产从私人变成公共财产,你很好。 像这样

class Square :public Shape
{
private:
    double Area;

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

class Circle :public Shape
{
private:
    double Circumference;

public:
    Circle();
    ~Circle();
};