【发布时间】:2018-06-14 19:48:04
【问题描述】:
我有以下代码 (live on Coliru):
// untouchable extern library .hpp file
typedef union ExternLibraryUnion
{
int a;
float b;
}ExternLibraryUnion;
// my code
#include <iostream>
class Container{
public:
Container() : m_union(NULL) {};
~Container(){
if(m_union){
delete m_union;
}
}
void init(){
m_union = new ExternLibraryUnion();
}
ExternLibraryUnion* get_union(){
return m_union;
}
private:
ExternLibraryUnion* m_union;
};
class Master{
public:
Master() : m_union(NULL) {
m_container.init();
};
~Master(){
if(m_union){
delete static_cast<ExternLibraryUnion*>(m_union);
}
}
void load(){
}
void set(int i){
m_union = m_container.get_union();
m_union->a = i;
}
void* get_union(){
return m_union;
}
private:
void* m_union;
Container m_container;
};
class Worker{
public:
Worker() : m_extern_library_union(NULL) {};
~Worker(){
if (m_extern_library_union){
delete m_extern_library_union;
}
}
void load(Master& master){
m_extern_library_union = reinterpret_cast<ExternLibraryUnion*>(master.get_union());
}
int get_int(){
return m_extern_library_union->a;
}
private:
ExternLibraryUnion* m_extern_library_union;
};
int main()
{
Master master;
master.set(3);
Worker worker;
worker.load(master);
std::cout << worker.get_int() << std::endl;
}
代码产生:
main.cpp: In member function 'void Master::set(int)':
main.cpp:55:16: error: 'void*' is not a pointer-to-object type
m_union->a = i;
^~
在一个外部库中,定义了一个union ExternLibraryUnion,我在自己的代码中使用它。我无法理解的问题在于Master 类的set 方法。 Master 成员 void* m_union 应该指向存储在成员 Container m_container 中的联合。当我设置m_union = m_container.get_union() 时,编译器应该能够知道我从get_union() 方法调用中得到了ExternLibraryUnion*。所以我不太会因为分配m_union->a = i 而出现错误。当然,void* 没有类型,但我为它分配了一个精确类型为 ExternLibraryUnion 的指针。
假设我不能直接触摸Container m_container 对象。我需要通过void* m_union指针进行分配。
非常感谢任何帮助!
【问题讨论】:
-
该语言如何知道您将其设置为什么?
void*是`void*。 -
void*在您不知道自己指向什么时使用。如果你不知道你指向什么,你怎么能分配给它的一个成员? -
专业提示:如果您将
void*用于与强制您使用void *的遗留或C 风格API 接口之外的任何其他用途,那么您几乎肯定会走上一条错误的道路。 -
void* 适用于您知道它指向什么但不希望代码或编译器知道的情况。
-
您为什么不在
Master中使用ExternLibraryUnion*?
标签: c++ unions void-pointers