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

Posted

技术标签:

【中文标题】如何创建指向继承类对象的指针数组【英文标题】: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(); 中给我一个错误,我不知道如何创建一个指向继承类的指针数组。

【问题讨论】:

【参考方案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();
;

【讨论】:

以上是关于如何创建指向继承类对象的指针数组的主要内容,如果未能解决你的问题,请参考以下文章

在c++编程中,怎么定义对象数组的指针?

如何在Objective-C中动态分配指向对象的指针数组?

如何创建指针数组?

如何计算指向不同向量数组中特定对象的指针的出现次数

使用具有指向派生类对象的指针的基类指针数组调用派生类方法

如何通过 C++ 中指向该数组的指针访问另一个类中的数组?