Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 返回结构而不暴露它_C++ - Fatal编程技术网

C++ 返回结构而不暴露它

C++ 返回结构而不暴露它,c++,C++,我的程序中有一个结构 struct secret_structure{ string a; string b; void *c; }; 我有一份这样的结构清单 std::map<string name, secret_structure> my_map 我有以下选择: 在get_from_map函数中传递秘密_结构的指针。get_from_映射填充结构。我不想这样做,因为结构会暴露出来 我可以使用不同

我的程序中有一个结构

struct secret_structure{
             string a;
             string  b;
             void *c;
};
我有一份这样的结构清单

std::map<string name, secret_structure> my_map
我有以下选择:

  • 在get_from_map函数中传递秘密_结构的指针。get_from_映射填充结构。我不想这样做,因为结构会暴露出来

  • 我可以使用不同的函数从结构中返回不同的值。此处结构不会暴露,但看起来不干净


  • 你能帮我做一些其他的选择,这样结构本身就不会暴露。

    然后以json或xml或其他格式返回


    或者ASN.1可能更紧凑

    您无法做到这一点(至少,不能使用传统的C++),我想不出有什么好的理由您应该这么做。如果您的内部结构不是您希望发布信息的方式,请找到合适的方式/数据类型并定义转换。

    您可以传递包含指向真实对象指针的句柄,而不是传递结构:

    // public_interface.h
    
    struct MySecretStruct; // I don't want to publish what's inside
    
    struct WhatYouCanSee
    {
        MySecretStruct *msp; // The "P"ointer to "IMPLE"mentation
    
        WhatYouCanSee(int a, double b);
        ~WhatYouCanSee();
        WhatYouCanSee& operator=(const WhatYouCanSee&);
        WhatYouCanSee(const WhatYouCanSee&);
    
        void method1();
        void method2(int x);
    };
    

    这些方法只是对实际对象方法调用的包装。

    您需要的是pimpl习惯用法


    基本上,您声明了一个类,该类有一个到secret结构的接口,并持有一个指向secret结构实例的指针。您可以在不指定实现细节的情况下向前声明结构。然后在CPP文件中访问机密结构。如果要向第三方提供,可以以头/二进制格式提供。

    为什么不公开该结构?为什么不将
    机密结构的数据成员设置为私有?然后为您想要公开的部分提供访问器函数?即使有可能,调用方应该如何处理这个未公开的结构?您可能想了解有关的内容。@juanchopanza:如果您想将指针视为某个不透明结构的句柄,这有点道理。C与
    文件
    执行类似的操作。不确定我喜欢C++的思想,其中封装是内置于语言……但是EH。这不是没有先例的…-1问题中没有任何东西表明运行时解析格式是可取的,但它为运行时错误引入了一个重要的新表面,降低了速度,并使结果更难使用。注意:这允许的自由之一——返回与
    secret_structure
    字段不符合1:1的结果——最好使用单独的
    结构来处理;另一个方面是所有权,但是在
    映射中查找结构可以通过
    const
    引用、通过值、通过
    共享的ptr
    弱的ptr
    唯一的ptr
    返回它。。。其他格式也没有好处。@TonyD你的评论听起来更像是对原始问题的一个好答案?你为什么对我的评论发表评论?“你为什么对我的评论发表评论?”-你在上面输入了“答案”;评论直接列在问题下面。人们被含蓄地邀请对答案进行投票和评论——这是本网站的主要概念,以及最佳答案如何“浮动”到页面顶部。6502的答案推荐了我提到的相同的中间
    struct
    方法-我添加重复答案没有意义。我的评论基本上是要指出,您的答案所带来的按值好处是可用的,而无需不希望的移动到中间数据格式。@TonyD好的,足够公平+1-这是一项重要的技术。但是,值得考虑将其设置为不可复制的,因为语义的选择是相当随意的,并且可能会造成混乱。(例如,如果您的
    操作符=(const WhatYouCanSee&)
    MySecretStructs
    之间复制数据,或者只是让
    msp
    地址与
    MySecretStruct
    地址相同?)@TonyD:与常规(非pimpled)对象一样,您可以决定如何分配和复制构造。我发现一个经常有用的解决方案是计算后实例引用,这样可以复制前对象(并且可以将其放置在标准容器中),但不会复制真实的实例。哦-我看到您刚刚在答案中编辑了指向“实现”的“指针”。事实上,我认为您建议为调用查找的代码所需的特定访问提供一个自定义代理接口(没有所有权)
    pImpl
    意味着所有客户端代码都使用
    WhatYouCanSee
    s(因此间接寻址、所有权、额外堆使用以及可能更胖的接口)。任何一个都可能适合——细节上的魔鬼。
    // public_interface.h
    
    struct MySecretStruct; // I don't want to publish what's inside
    
    struct WhatYouCanSee
    {
        MySecretStruct *msp; // The "P"ointer to "IMPLE"mentation
    
        WhatYouCanSee(int a, double b);
        ~WhatYouCanSee();
        WhatYouCanSee& operator=(const WhatYouCanSee&);
        WhatYouCanSee(const WhatYouCanSee&);
    
        void method1();
        void method2(int x);
    };