类名称指针的C++数组

类名称指针的C++数组,c++,arrays,pointers,dynamic-memory-allocation,C++,Arrays,Pointers,Dynamic Memory Allocation,我希望能够保存一个类名数组,并简单地将索引传递给一个函数,该函数将创建某个类的实例。我有内存限制,所以我不想简单地创建一个对象数组 以下是我最具描述性的伪代码: 课程: class Shape { public: Shape(); }; class Square : public Shape { public: Square(); }; class Triangle : public Shape { public: Triangle(); }; 主要内容: 如果这令

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

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

课程:

class Shape
{
public:
    Shape();
};

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

class Triangle : public Shape
{
public:
    Triangle();
};
主要内容:

如果这令人困惑,我可以试着澄清。提前谢谢

编辑:

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

创建一个std::vector,然后你就可以做v.emplace\u backnew Triangle;在C++11中。在C++03中,可以使用v.push_backnew 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;
创建一个std::vector,然后你可以做v.emplace\u backnew Triangle;在C++11中。在C++03中,可以使用v.push_backnew 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;
试试这个:

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;
}
试试这个:

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;
}

听起来你想要某种工厂:

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;
}
然后,当您希望在给定用户输入的情况下创建特定形状时,可以执行以下操作:

int myNumber;
cin >> myNumber;
Shape* shape = Shape::create(myNumber);
这是它最简单的形式。但是,我建议让create函数返回std::unique_ptr,而不是原始指针。我还将设置静态常量来表示不同的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;
}

听起来你想要某种工厂:

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;
}
然后,当您希望在给定用户输入的情况下创建特定形状时,可以执行以下操作:

int myNumber;
cin >> myNumber;
Shape* shape = Shape::create(myNumber);
这是它最简单的形式。但是,我建议让create函数返回std::unique_ptr,而不是原始指针。我还将设置静态常量来表示不同的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;
}

我将创建此函数:

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;
}

我将创建此函数:

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;
}


你不能用你想要的方式来做这件事。你也许可以聪明一点使用模板并找出一些办法。虽然我知道你在发布伪代码,但请记住,你希望基类是虚拟的,这样你就可以实际调用基类指针上的方法,并让它们正确地调用派生类的方法。你不能用你尝试的方式来做这件事。你可能会对模板有点聪明,然后想出一些办法。虽然我知道你在发布伪代码,但请记住,你希望基类是虚拟的,这样你就可以实际调用基类指针上的方法,并让它们正确地调用派生类的方法。Tony,我在Arduino上实现了这一点,因此无法使用向量。@RyanTuck我建议使用模板或原始指针数组shape*[10]shapes@phresnel我不知道OP是否可以使用智能指针,他不是普通的PC。修复了错误。他还说他不能使用向量,不幸的是,你的答案几乎是白费力气:Tony,我在Arduino上实现了这一点,因此无法使用向量。@RyanTuck我建议使用模板或指针原始数组shape*[10]shapes@phresnel我不知道OP是否可以使用智能指针,他不是一个普通的电脑。修正了错误。他还说他不能使用向量,所以不幸的是,你的答案几乎是白费力气:正是我想要的!谢谢正是我要找的!谢谢这个漏洞。至于我对这个答案的立场,你可能想看看我的个人资料页面。是的,它泄露了-就像原始代码一样,这只是一个让事情进展的想法。这个泄露了。至于我对这个答案的立场,你可能想看看我的个人资料页面。是的,它泄露了——就像原始代码一样,这只是一个让事情进展的想法。