如何调用列表中对象的函数

How to call a function of an object in a list?

本文关键字:对象 函数 列表 何调用 调用      更新时间:2023-10-16

我正在编写一个绘画程序。程序将按绘制顺序存储在图形窗口上绘制的元素。我想使用"LIST"来存储绘制的形状。形状有不同的类型,即allShapes是父类,line是子类。请告诉我如何在allShapes列表中存储一行并调用其函数。

这是示例代码:

    class allShapes
    {
     protected:
     int * points; //vertices of the shape
     int color; //color of the shape
     int n; //no. of points
        public:
    //virtual void draw()= 0;
    virtual void draw()
    {
    }
};
       class line:public allShapes
       {
         public:
     line()
     {
    points = new int[4];
    n = 2;
     }
    void draw()
   {
        //Code here
       }
      };

    int main()
   {
int mouse_x, mouse_y;
char key_pressed;
GP142_open();           /* Open and initialize the GP142 Graphics Window    */
list<allShapes> shapes;
int quit = 0;
while (!quit) {
    switch (GP142_await_event(&mouse_x, &mouse_y, &key_pressed)) {
    case GP142_MOUSE:
        if ((mouse_x > -490 && mouse_x<-445) && (mouse_y>305 && mouse_y < 360)) // If user selects the draw line option
        {
            line newLine;
            shapes.push_back(newLine);
            allShapes check = shapes.front();
            check.draw();
        }
        break;
    case GP142_QUIT:
        quit = 1;
        break;
    default:
        break;
    }
}
   }

但是程序没有调用线对象的绘制函数。我在allShapes中也有虚拟函数绘制。如何调用check.draw((在屏幕上画一条线?

对于多态对象,您不能为基类保留足够的存储空间,然后期望能够将任何派生类插入该空间。这就是你说的:

list<allShapes> shapes;

每当您试图将line插入allShapes对象的空间时,都会发生lineallShapes部分将被存储,而line部分将被忽略。因此,您得到了一个不是line的对象,对其调用.draw()不会调用line::draw()。给定对象的动态类型allShapes,它将调用正确的draw()方法。

当你说:时,同样的事情再次发生

allShapes check = shapes.front();
check.draw();

从CCD_ 11得到的任何类型的结果都被转换成CCD_。如果您有一个line的列表,那么它将在此处转换为allShapes

使用多态性通常需要使用指针或引用:

list<unique_ptr<allShapes>> shapes;

现在你可以将行放入这个集合:

shapes.push_back(make_unique<line>()); // make_unique is C++14

这样,line就不会转换为allShapes,因此,当进行虚拟调度以根据对象的真实动态类型找到正确的方法时,将使用linedraw()方法。

为了访问列表中的对象,您可以使用引用:

allShapes &check = shapes.front();
check->draw();

如果你是从一种默认使用引用类型的语言(如Java或C#(学习C++的,那么你真的需要了解C++值类型是如何工作的。在其他语言中,你可以到处使用指针,但语法并不明显。要在C++中使用指针,必须显式地使用特殊的指针语法。

你可能会发现另一个答案,我在这里介绍了这一点:与C++中的对象数组混淆

问题就在这里:

        line newLine;
        shapes.push_back(newLine);
        allShapes check = shapes.front();
        check.draw();

您正在复制行对象,而不是引用它。容器shapes不应由对象组成,而应由指向对象的指针组成。如果将线对象复制到allShapes对象中,则allShapes对象不会变为line

将容器声明为

list<allShapes*> shapes;

然后写入

        line* newLine = new line();
        shapes.push_back(newLine);
        allShapes* check = shapes.front();
        check->draw();

并记住CCD_ 23某处的对象。