指向类名的指针数组

C++ Array of pointers to class names

本文关键字:指针 数组      更新时间:2023-10-16

我希望能够保持类名称的数组,并简单地传递一个索引到一个函数,这将创建一个特定类的实例。我有内存限制,所以我不想简单地创建一个对象数组。

下面是我最具描述性的伪代码:

类:

class Shape
{
public:
    Shape();
};
class Square : public Shape
{
public:
    Square();
};
class Triangle : public Shape
{
public:
    Triangle();
};
主:

int main()
{
    pointerToShapeClass arrayOfShapes[2];       // incorrect syntax - but
    arrayOfShapes[0] = pointerToSquareClass;    // how would i do this?
    arrayOfShapes[1] = pointerToTriangleClass;
    cin << myNumber;
    // Depending on input, create instance of class corresponding to array index
    if (myNumber == 0) { // create Square   instance }
    if (myNumber == 1) { // create Triangle instance }
    return 0;
}

如果这让你困惑,我可以试着解释一下。提前感谢!

编辑:

实际上,我认为我只需要一个指向类的指针,而不需要实际实例化该类。

听起来你想要某种工厂:

class Shape
{
public:
    Shape();
    static Shape* create(int id);
};
Shape* Shape::create(int id) {
  switch (id) {
    case 0: return new Square();
    case 1: return new Triangle();
  }
  return NULL;
}

然后当您想要创建给定用户输入的特定Shape时,您可以这样做:

int myNumber;
cin >> myNumber;
Shape* shape = Shape::create(myNumber);

这是它最简单的形式。但是,我建议让create函数返回一个std::unique_ptr<Shape>,而不是一个原始指针。我还将设置静态常量来表示不同的id。

class Shape
{
public:
    Shape();
    static std::unique_ptr<Shape> create(int id);
    enum class Id { Square = 0, Triangle = 1 };
};
std::unique_ptr<Shape> Shape::create(Shape::Id id) {
  switch (id) {
    case Shape::Id::Square: return new Square();
    case Shape::Id::Triangle: return new Triangle();
  }
  return nullptr;
}

试试这个:

int main()
{
    std::vector<Shape*> shapes;
    cin << myNumber;
    // Depending on input, create instance of class corresponding to array index
    if (myNumber == 0) { shapes.push_back(new Square(); }
    if (myNumber == 1) { shapes.push_back(new Triangle(); }
    return 0;
}

创建std::vector<Shape*>,然后您可以在c++ 11中执行v.emplace_back(new Triangle());。在c++ 03中,你可以使用v.push_back(new Triangle());

可以使用原始数组

Shape* shapes[10]; // array of pointers;
shapes[0] = new Triangle(); 

你也可以使用模板创建一个模板

template<typename ShapeType>
class Shape
{
 public:
     ShapeType draw(); 
     //All common Shape Operations
};
class Triangle
{
};
//C++11
using Triangle = Shape<Triangle>;
Triangle mytriangle;
//C++03
typedef Shape<Square> Square;
Square mysquare;

我将创建这个函数:

Shape getNewShape(int shapeId)
{
    switch (shapeId)
    {
        case 1: return new Square();
        case 2: return new Triangle();
    }
    //here you should handle wrong shape id
}

然后像这样使用:

int main()
{
    cin << myNumber;
    // Depending on input, create instance of class corresponding to array index
    shape tempShape = getNewShape(myNumber);
    return 0;
}