MST

星途 面试题库

面试题:C++ 类成员回调函数传递复杂结构体参数

定义一个包含多个不同类型成员(如 `int`、`float`、`std::string`)的结构体 `ComplexStruct`。在一个 `MyClass` 类中,有一个成员函数 `memberCallback` 作为回调函数,要求在外部触发该回调函数并传递 `ComplexStruct` 类型的结构体参数。同时,要考虑如何处理结构体对象的生命周期,避免内存泄漏。请详细实现类的定义、回调函数,以及触发回调传递参数的完整代码,并解释你的设计思路。
26.4万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

1. 设计思路

  • 结构体定义:定义 ComplexStruct 结构体,包含 intfloatstd::string 成员,用于存储不同类型的数据。
  • 类定义:在 MyClass 类中定义 memberCallback 成员函数作为回调函数。由于是成员函数,在作为回调使用时需要借助 std::bindstd::function 来处理 this 指针。
  • 回调触发:在外部创建 MyClass 对象和 ComplexStruct 对象,通过合适的方式调用 memberCallback 并传递 ComplexStruct 对象。
  • 生命周期管理:使用智能指针(如 std::unique_ptrstd::shared_ptr)来管理 ComplexStruct 对象的生命周期,避免内存泄漏。

2. 代码实现

#include <iostream>
#include <memory>
#include <string>

// 定义ComplexStruct结构体
struct ComplexStruct {
    int intValue;
    float floatValue;
    std::string stringValue;
};

class MyClass {
public:
    // 成员回调函数
    void memberCallback(const ComplexStruct& data) {
        std::cout << "Int value: " << data.intValue << std::endl;
        std::cout << "Float value: " << data.floatValue << std::endl;
        std::cout << "String value: " << data.stringValue << std::endl;
    }
};

int main() {
    // 使用std::unique_ptr管理ComplexStruct对象的生命周期
    std::unique_ptr<ComplexStruct> complexData = std::make_unique<ComplexStruct>();
    complexData->intValue = 42;
    complexData->floatValue = 3.14f;
    complexData->stringValue = "Hello, World!";

    MyClass myObject;
    // 调用成员回调函数并传递ComplexStruct对象
    myObject.memberCallback(*complexData);

    // std::unique_ptr会在离开作用域时自动释放ComplexStruct对象的内存,避免内存泄漏
    return 0;
}

3. 解释

  • 结构体 ComplexStruct:定义了不同类型的成员变量 intValuefloatValuestringValue,用于存储数据。
  • MyClass:包含成员函数 memberCallback,该函数接受一个 ComplexStruct 类型的常量引用参数,输出结构体中的数据。
  • main 函数
    • 使用 std::make_unique 创建 ComplexStruct 对象,由 std::unique_ptr 管理其生命周期。
    • 创建 MyClass 对象 myObject,调用 myObject.memberCallback 并传递 ComplexStruct 对象。
    • std::unique_ptr 在离开作用域时会自动调用 ComplexStruct 的析构函数,释放内存,从而避免内存泄漏。如果需要更复杂的共享所有权场景,可以使用 std::shared_ptr