MST

星途 面试题库

面试题:C++成员函数指针与函数对象的深度应用

假设有一个类 `MyClass`,包含多个成员函数。请设计一种机制,使用成员函数指针和函数对象,实现根据运行时的不同条件,动态调用不同的成员函数,并且要考虑线程安全以及高效的内存管理。详细阐述设计思路并给出关键代码实现。
29.9万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

设计思路

  1. 成员函数指针:使用成员函数指针来存储不同的成员函数,以便在运行时根据条件进行调用。
  2. 函数对象:封装成员函数指针,通过函数对象的方式来实现调用,这样可以更方便地进行管理和传递。
  3. 线程安全:使用互斥锁(std::mutex)来保护共享资源,确保在多线程环境下的安全访问。
  4. 高效内存管理:使用智能指针(std::unique_ptrstd::shared_ptr)来管理对象和函数对象,避免内存泄漏。

关键代码实现

#include <iostream>
#include <functional>
#include <mutex>
#include <memory>

class MyClass {
public:
    void func1() {
        std::cout << "func1 called" << std::endl;
    }

    void func2() {
        std::cout << "func2 called" << std::endl;
    }

    using FuncPtr = void (MyClass::*)();
    using FuncObj = std::function<void()>;

    // 线程安全调用成员函数
    void callFunction(FuncPtr func, std::unique_lock<std::mutex>& lock) {
        (this->*func)();
    }

    // 根据条件选择并调用成员函数
    void execute(int condition) {
        static std::mutex mtx;
        std::unique_lock<std::mutex> lock(mtx);

        FuncObj funcObj;
        if (condition == 1) {
            funcObj = std::bind(&MyClass::func1, this);
        } else if (condition == 2) {
            funcObj = std::bind(&MyClass::func2, this);
        }

        if (funcObj) {
            funcObj();
        }
    }
};

int main() {
    std::unique_ptr<MyClass> obj = std::make_unique<MyClass>();
    obj->execute(1);
    obj->execute(2);
    return 0;
}

代码说明

  1. MyClass:定义了两个成员函数 func1func2,以及用于存储成员函数指针的类型别名 FuncPtr 和用于封装成员函数调用的函数对象类型别名 FuncObj
  2. callFunction:通过成员函数指针调用成员函数,并使用 std::unique_lock 确保线程安全。
  3. execute:根据传入的条件,选择相应的成员函数,并使用函数对象进行调用,同时使用互斥锁保护共享资源。
  4. main:创建 MyClass 对象,并根据不同条件调用 execute 函数,展示动态调用不同成员函数的功能。