【问题标题】:C++ Array of pointers to class namesC++ 指向类名的指针数组
【发布时间】:2013-03-12 15:49:50
【问题描述】:

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

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

类:

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

如果这令人困惑,我可以尝试解释一下。提前致谢!

编辑:

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

【问题讨论】:

  • 您不能以您尝试的方式执行此操作。你可能会有点聪明地使用模板并想出办法。
  • 虽然我知道您发布的是伪代码,但请记住,您需要将基类设为虚拟,以便实际调用基类指针上的方法并让它们正确调用派生类的方法。

标签: c++ arrays pointers dynamic-memory-allocation


【解决方案1】:

听起来你想要某种工厂:

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&lt;Shape&gt;,而不是原始指针。我还会设置静态常量来表示不同的 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;
}

【讨论】:

  • 正是我想要的!谢谢!
【解决方案2】:

试试这个:

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

【讨论】:

  • 这泄漏了。对于我对“试试这个”答案的立场,您可能需要查看我的个人资料页面。
  • 是的,它会泄漏 - 与原始代码一样,它只是一个让事情动起来的想法。
【解决方案3】:

创建一个std::vector&lt;Shape*&gt;,然后你可以在 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;

【讨论】:

  • 托尼,我在 Arduino 上实现这个,因此无法使用向量。
  • @RyanTuck 我提出了一个带有模板或原始指针数组的建议
  • Shape*[10] shapes unique_ptr 而不是原始指针。手动管理内存真的很重要。
  • @phresnel 我不知道OP是否可以使用智能指针,他不是普通的PC。修正错误。
  • 他还说他不能使用向量,所以不幸的是你的回答实际上付诸东流:(
【解决方案4】:

我会创建这个函数:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-25
    • 2013-04-19
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多