返回结构而不暴露它

时间:2013-07-22 06:29:39

标签: c++

我的程序中有一个结构

struct secret_structure{
             string a;
             string  b;
             void *c;
};

我有这样的结构列表

std::map<string name, secret_structure> my_map

我必须编写一个函数,通过将其与名称映射来返回结构。

get_from_map(string name, secret_structure * struct) //Kind of function

我有以下选项:

  1. 在get_from_map函数中传递secret_structure的指针。 get_from_map填充结构。我不想这样做,因为结构会暴露出来。

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

  3. 你能帮我解决任何其他选择,使结构本身不暴露。

4 个答案:

答案 0 :(得分:8)

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

// 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);
};

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

答案 1 :(得分:7)

你想要的是pimpl成语。

Pimple Idiom

基本上,您声明一个具有秘密结构接口的类,并保存指向秘密结构实例的指针。您可以转发声明结构而不指定实现细节。然后在CPP文件中访问秘密结构。如果您将其提供给第三方,则可以以标题/二进制格式提供。

答案 2 :(得分:1)

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

或ASN.1可能更紧凑

答案 3 :(得分:1)

你不能这样做(至少,不能用传统的C ++),我不能认为你应该这样做的一个很好的理由。如果您的内部结构不是您想要发布信息的方式,请找到合适的方式/数据类型并定义转换。