考虑以下代码
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();
中的错误,而且我不知道如何创建指向继承类的指针数组。
答案 0 :(得分:0)
您需要指定所需的继承类型;更具体地说,您需要告诉编译器它是public
的继承,即整个代码库可以知道Circle
和Square
是Shape
。 / 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::array
和std::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();
};