如何调用列表中对象的函数
How to call a function of an object in a list?
我正在编写一个绘画程序。程序将按绘制顺序存储在图形窗口上绘制的元素。我想使用"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
对象的空间时,都会发生line
的allShapes
部分将被存储,而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
,因此,当进行虚拟调度以根据对象的真实动态类型找到正确的方法时,将使用line
的draw()
方法。
为了访问列表中的对象,您可以使用引用:
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某处的对象。
- 如何创建对象函数指针C++映射?
- 为什么我可以改变常量对象中的成员变量,这是返回常量对象函数的结果?
- 如何将对象函数的实例传递给另一个函数
- 调用模板函数的问题"No matching function for call"参数:迭代器、对象函数
- makefile对我的名称空间对象/函数/构造函数的不确定引用
- 将对象函数转换为函数指针
- 非对象函数/类函数C++
- 线程对象函数 C++
- C 将成员对象函数分配给类成员功能
- 使用基本指针调用派生对象函数
- 可以(通过编译器)使用多少个线程来初始化全局对象(函数main之前)
- C++类对象函数
- 对对象::函数的未定义引用
- 无法弄清楚将多个对象函数作为单独的线程调用的语法
- 在提升作用域出口中调用对象函数
- 使用基指针来使用派生对象函数
- 在for_each lambda 中调用对象函数
- C++:: 模板函数 - 从对象函数获取对象的地址
- Qt5 未解析的外部静态元对象函数
- 通过变量使用对象和对象函数