You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C++中使用点运算符定义嵌套调用形式的函数结构

C++ 嵌套点运算符调用结构实现方案

你要的调用形式可以通过嵌套类+公开成员对象的方式实现,核心逻辑是把不同分类的操作封装到不同的内部类中,再在主类暴露对应类的实例作为访问入口。

基础实现示例

以下是可直接运行的最小实现:

#include <iostream>

class RegeditAccessor {
public:
    // 封装所有Key相关操作的嵌套类
    class KeyOperator {
    public:
        void Create() {
            // 替换为实际的注册表键创建逻辑
            std::cout << "Regedit.Key.Create() 被调用" << std::endl;
        }
        // 可继续扩展Key的其他方法,比如Delete、Open等
    };

    // 封装所有Value相关操作的嵌套类
    class ValueOperator {
    public:
        void Create() {
            // 替换为实际的注册表值创建逻辑
            std::cout << "Regedit.Value.Create() 被调用" << std::endl;
        }
        void Read() {
            // 替换为实际的注册表值读取逻辑
            std::cout << "Regedit.Value.Read() 被调用" << std::endl;
        }
        // 可继续扩展Value的其他方法,比如Write、Delete等
    };

    // 公开成员对象,作为对应操作的调用入口
    KeyOperator Key;
    ValueOperator Value;
};

// 全局实例化主类,如果你不需要全局使用,也可以在业务代码中按需实例化
RegeditAccessor Regedit;

// 测试调用
int main() {
    Regedit.Key.Create();
    Regedit.Value.Create();
    Regedit.Value.Read();
    return 0;
}

运行后输出如下:

Regedit.Key.Create() 被调用
Regedit.Value.Create() 被调用
Regedit.Value.Read() 被调用

共享主类状态的变种实现

如果Key、Value的操作需要访问主类的公共资源(比如全局注册表句柄、配置参数等),可以在嵌套类中保存主类的引用,改造示例如下:

#include <windows.h> // 引入注册表相关头文件,仅示例用

class RegeditAccessor {
private:
    HKEY m_rootHandle; // 主类保存的公共资源:根键句柄
public:
    class KeyOperator {
    private:
        RegeditAccessor& m_parent; // 保存父类实例引用
    public:
        // 构造时传入父类引用
        explicit KeyOperator(RegeditAccessor& parent) : m_parent(parent) {}
        void Create() {
            // 可直接访问父类的公共/私有成员
            RegCreateKeyExA(m_parent.m_rootHandle, "SOFTWARE\\TestPath", 0, NULL, 0, KEY_WRITE, NULL, NULL, NULL);
        }
    };

    class ValueOperator {
    private:
        RegeditAccessor& m_parent;
    public:
        explicit ValueOperator(RegeditAccessor& parent) : m_parent(parent) {}
        void Read() {
            DWORD dataLen = 256;
            char buffer[256];
            RegGetValueA(m_parent.m_rootHandle, "SOFTWARE\\TestPath", "TestValue", RRF_RT_ANY, NULL, buffer, &dataLen);
        }
        void Create() {
            // 对应值创建逻辑
        }
    };

    // 主类构造函数,初始化成员对象时传入自身引用
    RegeditAccessor() : Key(*this), Value(*this) {
        // 初始化公共资源,比如打开根键
        RegOpenKeyExA(HKEY_LOCAL_MACHINE, "SOFTWARE", 0, KEY_READ | KEY_WRITE, &m_rootHandle);
    }
    ~RegeditAccessor() {
        // 释放公共资源
        RegCloseKey(m_rootHandle);
    }

    KeyOperator Key;
    ValueOperator Value;
};

// 实例化后即可正常调用
RegeditAccessor Regedit;

简化写法(不推荐)

如果不需要复用嵌套类的定义,也可以用匿名嵌套类直接定义成员,代码更短但可读性更低:

class RegeditAccessor {
public:
    class {
    public:
        void Create() { /* 逻辑 */ }
    } Key;
    class {
    public:
        void Create() { /* 逻辑 */ }
        void Read() { /* 逻辑 */ }
    } Value;
};

内容的提问来源于stack exchange,提问作者user10825637

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 07:57:03