gpt4 book ai didi

c++ - 使用纯虚类创建 vector (模板)

转载 作者:行者123 更新时间:2023-11-27 22:56:29 25 4
gpt4 key购买 nike

我目前有一个名为 Shape 的基类,我创建了一个纯虚函数。

class Shape
{
protected:
float area;
float perimeter;

public:
virtual float calcArea() = 0;
virtual float calcPerimeter() = 0;
virtual void printArea() = 0;
virtual void printPerimeter() = 0;
};

我创建了两个类

class Circle : public Shape
{
public:
Circle(float x);
~Circle();

float calcPerimeter();
float calcArea();
void printPerimeter();
void printArea();

private:
float radius;
};

class Square : public Shape
{
public:
Square(float x);
~Square();

float calcPerimeter();
float calcArea();
void printPerimeter();
void printArea();

private:
float length;
};

但是,当我尝试创建一个 Shape 类型的 vector 时,它说无法实例化虚拟对象“Shape 无法实例化抽象类”

std::vector<Shape> shapeVector;

我实际上并没有创建“对象”,因为我只是创建了一个形状类型的 vector 并添加了圆形和方形。那么为什么这不起作用?我知道如果我让 Shape 不是我可以继承的纯虚拟类。

我的逻辑是,我没有理由实例化“Shape”类型的类,所以我将其设为纯虚拟,但我仍然想使用 Shape vector 来存储我的派生类。

完整的主要功能在这里

Square square(3);
Circle circle(5);

square.calcArea();
square.calcPerimeter();

circle.calcArea();
circle.calcPerimeter();


std::vector<Shape> shapeVector;

shapeVector.push_back(square);
shapeVector.push_back(circle);

for (int i = 0; shapeVector.size(); i++) {
shapeVector[i].printArea();
shapeVector[i].printPerimeter();
}

最佳答案

您的声明“我实际上并不是在创建一个“对象”,因为我只是在创建一个形状类型的 vector 并添加圆和正方形。”是不正确的。您正在创建一个实际的 vector Shape对象。由于您无法实例化 Shape这就是您收到错误的原因。您需要使用 Shape* (或者更可能是形状周围的 shared_ptrunique_ptr)作为您的模板类型。

将其视为模板类型的原始类型。如果您使用 vector<int>你在 vector 中得到实际的整数。同样的想法也适用于对象。

关于c++ - 使用纯虚类创建 vector (模板),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32544647/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com