当前位置: 首页 > article >正文

『 C++ 』深入理解类中的 this 指针在适配器的作用

深入理解类中的 this 指针和适配器的作用

在 C++ 编程的世界里,this 指针和适配器是两个非常重要的概念,它们能帮助我们写出更灵活、更易于维护的代码哦 今天呢,就来和大家详细讲讲它们在类中的使用,让我们通过具体代码来看看它们到底是怎么发挥作用的。

一、this 指针的角色

首先,我们得知道 this 指针是什么。在 C++ 中,对于类的非静态成员函数,this 指针是一个隐式参数,它指向调用该函数的对象自身。这有啥用呢?看个简单的例子吧:

#include <iostream>


class MyClass {
public:
    int value = 0;


    void setValue(int newValue) {
        this->value = newValue; // 用 this 指针明确访问成员变量
    }


    void printValue() {
        std::cout << "Value: " << value << std::endl; // 这里虽然没写 this,但其实也在使用它
    }
};


int main() {
    MyClass obj;
    obj.setValue(42);
    obj.printValue();
    return 0;
}

从这个例子可以看出,在 setValue 函数里,我们用 this 指针来准确地访问 value 这个成员变量。而在 printValue 函数中,虽然没有显式写出 this 指针,但它其实也在默默地发挥作用,确保我们访问的是当前对象的 value 成员呢 这就是 this 指针的一个基本作用啦。

那在回调函数里,this 指针就更有意思啦。想象一下,我们有两个类,其中一个类要使用另一个类的成员函数作为回调函数,这时候 this 指针就会派上大用场。就像下面这个例子:

#include <iostream>
#include <functional>


class DictServer {
public:
    void onConnection(int connectionId) {
        std::cout << "Connection established with ID: " << connectionId << std::endl;
    }
};


class ServerManager {
public:
    ServerManager() {
        // 用 std::bind 把 DictServer 的 onConnection 成员函数绑定起来
        _server.setConnectionCallback(std::bind(&DictServer::onConnection, this, std::placeholders::_1));
    }


private:
    DictServer _server;
};


int main() {
    ServerManager manager;
    return 0;
}

ServerManager 的构造函数中,我们使用 std::bind 来给 _server 设置回调函数。这里的 this 指针可是关键哦 因为 DictServer::onConnection 是个成员函数,它需要一个 DictServer 对象才能被调用。在 std::bind(&DictServer::onConnection, this, std::placeholders::_1) 里,this 指针通常就是 ServerManager 类的指针啦。这就意味着,我们可能在 ServerManager 里有个 DictServer 对象,而且当 onConnection 被调用时,是想使用 ServerManager 里的 DictServer 对象来操作的呢。

根据 Bjarne Stroustrup 的《The C++ Programming Language》(C++ 编程的权威书籍哦),this 指针在这种情况下能让我们更清晰地表达对象之间的关系,避免混淆,保证代码的正确性。

二、适配器(std::bind)的神奇之处

接下来,我们来聊聊 std::bind 这个强大的工具。它在 C++ 的 <functional> 头文件里,是一个很有用的工具呢,能把可调用对象(像函数、成员函数、函数对象等)和参数绑定在一起,然后生成一个新的可调用对象。

它是如何发挥作用的呢?

1. 绑定参数

std::bind 可以把成员函数、对象指针和占位符组合起来,创造一个新的函数对象哦。就像这样:

std::bind(&DictServer::onConnection, this, std::placeholders::_1);

这里,&DictServer::onConnection 是要绑定的成员函数,this 是调用这个成员函数的对象,std::placeholders::_1 是个占位符,表示新的可调用对象需要一个参数,这个参数会在调用 onConnection 函数的时候传进去。

2. 适配调用方式

正常情况下,我们调用 DictServeronConnection 成员函数,得像这样:dictServer.onConnection(connectionId); 但是呢,通过 std::bind,我们可以把它变成一个能被 _server.setConnectionCallback 接受的函数对象哦。因为 _server.setConnectionCallback 期望接收的是 std::function<void(int)> 类型的函数对象,而 std::bind 生成的新函数对象正好符合这个要求呢。

3. 延迟调用

还有一个很棒的功能,std::bind 生成的可调用对象可以先存起来,等到合适的时候再调用哦。在我们之前的 ServerManager 类的例子里,当 _server 触发连接事件时,它就会调用之前设置好的回调函数,也就是 std::bind 生成的那个可调用对象啦。

再看一个更完整的例子吧:

#include <iostream>
#include <functional>


class DictServer {
public:
    void onConnection(int connectionId) {
        std::cout << "Connection established with ID: " << connectionId << std::endl;
    }
};


class ServerManager {
public:
    ServerManager() {
        // 用 std::bind 绑定 DictServer 的 onConnection 成员函数
        _server.setConnectionCallback(std::bind(&DictServer::onConnection, this, std::placeholders::_1));
    }


    // 模拟触发 _server 的回调函数
    void simulateConnectionEvent(int connectionId) {
        _server.invokeConnectionCallback(connectionId);
    }


private:
    class Server {
    public:
        using ConnectionCallback = std::function<void(int)>;


        void setConnectionCallback(ConnectionCallback cb) {
            _callback = cb;
        }


        void invokeConnectionCallback(int connectionId) {
            if (_callback) {
                _callback(connectionId);
            }
        }


    private:
        ConnectionCallback _callback;
    };


    Server _server;
};


int main() {
    ServerManager manager;
    // 模拟发生连接事件
    manager.simulateConnectionEvent(42);


    return 0;
}

在这个更完整的例子里,ServerManager 类有个内部类 Server,它有个 ConnectionCallback 类型的成员变量 _callback,用来存储回调函数。我们可以用 setConnectionCallback 方法设置回调函数,用 invokeConnectionCallback 方法调用存储好的回调函数哦。

总之呢,this 指针和 std::bind 适配器在 C++ 编程中真的很有用啦 它们让我们可以更好地处理类之间的交互,特别是在复杂的系统中,能让代码更加灵活、模块化,提高代码的可维护性哦。

在实际开发中,像网络编程、GUI 编程这些领域,经常会用到它们呢。比如在网络编程里,当收到新的连接请求时,我们就可以用这种方式来调用相应的回调函数,处理各种连接事件。所以,掌握好它们,对我们写好 C++ 代码可是非常重要的哦 大家可以多试试,把它们运用到自己的代码中,感受一下它们的强大之处吧 希望这篇文章能帮助大家更好地理解 this 指针和适配器,让你的代码变得更加出色哦


http://www.kler.cn/a/512165.html

相关文章:

  • Axios 封装:处理重复调用与内容覆盖问题
  • ingress-nginx代理tcp使其能外部访问mysql
  • 从零开始:Spring Boot核心概念与架构解析
  • Git原理与应用(三)【远程操作 | 理解分布式 | 推送拉取远程仓库 | 标签管理】
  • 将IDLE里面python环境pyqt5配置的vscode
  • 力扣 有效的括号
  • 数据库高可用方案-03-主备等高可用架构
  • Node.js npm 安装过程中 EBUSY 错误的分析与解决方案
  • 如何在 Pytest 中使用命令行界面和标记运行测试
  • python清除空格函数
  • 深入解析浏览器异步任务调度 API:让 Web 开发更高效
  • 通过Ukey或者OTP动态口令实现windows安全登录
  • ent.SetDatabaseDefaults()
  • Windows图形界面(GUI)-QT-C/C++ - Qt QToolBox详解教程
  • JSON全解析:语法、转换与FastJson应用指南
  • Linux(UOS系统:DHCP)
  • 数据库的DML
  • Kafka 日志存储 — 日志索引
  • IO模型与NIO基础二
  • 算法随笔_13: 有效三角形的个数
  • CSS 默认值
  • app测试笔记
  • 【Linux】Linux入门(一) 用户与用户组
  • AI发展困境:技术路径与实践约束的博弈
  • Linux TCP 之 RTT 采集与 RTO 计算
  • leetcode350-两个数组的交集II