4

我的程序中有一个结构

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. 我可以有不同的函数来从结构中返回不同的值。这里结构不会暴露,但看起来不干净。

你能帮我做任何其他的选择吗,这样结构本身就不会暴露。

4

4 回答 4

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

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

于 2013-07-22T06:38:10.693 回答
7

你想要的是 pimpl 成语。

疙瘩成语

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

于 2013-07-22T06:40:56.460 回答
1

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

或者 ASN.1 可能更紧凑

于 2013-07-22T06:32:14.713 回答
1

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

于 2013-07-22T06:34:25.553 回答