MST

星途 面试题库

面试题:C++函数指针与指针函数在复杂场景下的应用

假设你正在开发一个图形渲染库,需要实现不同类型图形(如圆形、矩形)的绘制函数。请使用函数指针和指针函数分别设计一种架构来管理这些绘制函数,使得可以方便地添加新的图形类型以及调用相应的绘制函数,并阐述两种架构各自的优缺点。
44.5万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

函数指针架构

  1. 设计思路:定义一个函数指针类型,用于指向不同图形的绘制函数。创建一个数组,数组元素为该函数指针类型,每个元素对应一种图形的绘制函数。当需要添加新图形类型时,在数组中添加相应的函数指针,并实现对应的绘制函数。调用绘制函数时,通过数组索引来调用相应的函数指针。
  2. 示例代码(C语言)
#include <stdio.h>

// 定义绘制圆形的函数
void drawCircle() {
    printf("Drawing a circle.\n");
}

// 定义绘制矩形的函数
void drawRectangle() {
    printf("Drawing a rectangle.\n");
}

// 定义函数指针类型
typedef void (*DrawFunction)();

int main() {
    // 创建函数指针数组
    DrawFunction drawFunctions[2];
    drawFunctions[0] = drawCircle;
    drawFunctions[1] = drawRectangle;

    // 调用绘制函数
    drawFunctions[0]();
    drawFunctions[1]();

    return 0;
}
  1. 优点
    • 简单直观:实现方式较为直接,易于理解和维护。
    • 高效调用:通过数组索引直接调用函数指针,效率较高。
  2. 缺点
    • 扩展性有限:添加新图形类型时,需要手动修改数组大小并添加相应的函数指针,不够灵活。
    • 缺乏类型安全:函数指针本身不具备类型检查,可能导致调用错误的函数。

指针函数架构

  1. 设计思路:定义一个指针函数,该函数返回一个指向具体绘制函数的指针。在函数内部,可以根据传入的参数(如图形类型标识)来返回不同的绘制函数指针。调用绘制函数时,先调用指针函数获取具体的绘制函数指针,再调用该指针。添加新图形类型时,在指针函数中添加相应的逻辑来返回新图形的绘制函数指针。
  2. 示例代码(C语言)
#include <stdio.h>

// 定义绘制圆形的函数
void drawCircle() {
    printf("Drawing a circle.\n");
}

// 定义绘制矩形的函数
void drawRectangle() {
    printf("Drawing a rectangle.\n");
}

// 定义指针函数
typedef void (*DrawFunction)();
DrawFunction getDrawFunction(int shapeType) {
    if (shapeType == 0) {
        return drawCircle;
    } else if (shapeType == 1) {
        return drawRectangle;
    }
    return NULL;
}

int main() {
    // 获取绘制圆形的函数指针并调用
    DrawFunction circleFunction = getDrawFunction(0);
    if (circleFunction) {
        circleFunction();
    }

    // 获取绘制矩形的函数指针并调用
    DrawFunction rectangleFunction = getDrawFunction(1);
    if (rectangleFunction) {
        rectangleFunction();
    }

    return 0;
}
  1. 优点
    • 扩展性较好:添加新图形类型时,只需在指针函数中添加新的逻辑,不需要修改数组等数据结构,更灵活。
    • 类型安全相对提高:可以在指针函数中添加一些类型检查逻辑,提高安全性。
  2. 缺点
    • 调用效率稍低:每次调用绘制函数都需要先调用指针函数获取指针,增加了一层函数调用开销。
    • 代码复杂度增加:指针函数内部逻辑可能会随着图形类型的增加而变得复杂,增加了维护难度。