如何创建指向继承类对象的指针数组
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
继承,这意味着您的整个代码库都可以知道Circle
和Square
是Shape
。
只需将类的声明更改为:
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::array
和 std::unique_ptr<IShape>
,这意味着您的 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();
;
【讨论】:
以上是关于如何创建指向继承类对象的指针数组的主要内容,如果未能解决你的问题,请参考以下文章