Vector存放类成员函数指针

Vector存放类成员函数指针

#include <iostream>
#include <vector>

class Test
{
public:
    Test();
    ~Test();
    void Fun_1();
    void Fun_2();
    void Run();

private:
    std::vector<void (Test::*)()> funs_;
};

Test::Test() : funs_({&Test::Fun_1, &Test::Fun_2}) {}

Test::~Test() {}

void Test::Fun_1()
{
    std::cout << __func__ << std::endl;
}

void Test::Fun_2()
{
    std::cout << __func__ << std::endl;
}

void Test::Run()
{
    for (int i = 0; i < funs_.size(); ++i) {
        (this->*funs_[i])();
    }
    // 用for (auto fun : funs_)怎么实现?
}

int main(void)
{
    class Test test;
    test.Run();

    return 0;
}

结果输出:

Fun_1
Fun_2
C++中,`std::vector` 是一个非常常用的容器,用于存储动态大小的元素序列。它可以存储基本数据类型,也可以存储自定义数据类型(如类或结构体)。为了在 `std::vector` 中存储自定义数据类型,需要定义一个类或结构体,并确保其具有适当的构造函数和操作符重载(如需要)。 以下是一个完整的示例,展示如何定义一个自定义数据类型并将其存储到 `std::vector` 中: ### 定义自定义数据类型 ```cpp #include <iostream> #include <vector> #include <string> // 定义一个自定义数据类型 struct Person { std::string name; int age; // 构造函数 Person(const std::string& name, int age) : name(name), age(age) {} // 用于打印信息的成员函数 void print() const { std::cout << "Name: " << name << ", Age: " << age << std::endl; } }; ``` ### 使用 `std::vector` 存储 `Person` 对象 ```cpp int main() { // 创建一个存储 Person 对象的 vector std::vector<Person> people; // 添加元素 people.emplace_back("Alice", 30); people.emplace_back("Bob", 25); // 访问元素并调用成员函数 for (const auto& person : people) { person.print(); } return 0; } ``` ### 说明 - `std::vector<Person> people;` 声明了一个 `vector`,用于存储 `Person` 类型的对象。 - `emplace_back` 方法用于在 `vector` 的末尾构造一个新的 `Person` 对象。与 `push_back` 不同,`emplace_back` 允许直接在 `vector` 内部构造对象,避免了临时对象的创建。 - `for (const auto& person : people)` 使用范围 `for` 循环遍历 `vector` 中的所有 `Person` 对象,并调用 `print` 方法输出其信息。 ### 重载运算符(可选) 如果需要对 `Person` 对象进行排序或比较,可以重载比较运算符: ```cpp // 重载小于运算符,以便用于排序 bool operator<(const Person& a, const Person& b) { return a.age < b.age; } ``` 然后可以使用 `std::sort` 对 `vector` 中的元素进行排序: ```cpp std::sort(people.begin(), people.end()); ``` 这样,`std::sort` 会使用重载的 `<` 运算符来比较 `Person` 对象的 `age` 属性[^1]。 ### 注意事项 - 确保自定义类型具有适当的构造函数,以便 `vector` 能够正确地进行内存管理和对象构造。 - 如果自定义类型包含动态分配的资源(如指针),则需要特别注意深拷贝、移动语义以及析构函数的实现,以避免资源泄漏或浅拷贝问题。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值