我的程序中有一个结构
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
我有以下选项:
在get_from_map函数中传递secret_structure的指针。 get_from_map填充结构。我不想这样做,因为结构会暴露出来。
我可以使用不同的函数从结构中返回不同的值。这里的结构不会暴露,但看起来不干净。
你能帮我解决任何其他选择,使结构本身不暴露。
答案 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成语。
基本上,您声明一个具有秘密结构接口的类,并保存指向秘密结构实例的指针。您可以转发声明结构而不指定实现细节。然后在CPP文件中访问秘密结构。如果您将其提供给第三方,则可以以标题/二进制格式提供。
答案 2 :(得分:1)
然后以json或xml或其他格式返回。
或ASN.1可能更紧凑
答案 3 :(得分:1)
你不能这样做(至少,不能用传统的C ++),我不能认为你应该这样做的一个很好的理由。如果您的内部结构不是您想要发布信息的方式,请找到合适的方式/数据类型并定义转换。