我有这个:
class masterStruct {
public:
int counter;
bool synchronized;
std::string slaveIDs[3];
void test() { counter = 0; }
}
它在我的类中是这样定义的:
class MasterInterface {
public:
struct masterStruct masStruct;
}
我在 C 风格的回调函数中使用 masStruct。
我的问题是:test() 函数发生了什么?我知道结构和类本质上是相同的,类默认成员变量设置为私有(private)。在这种情况下,为什么 c++ 允许将类转换为结构,其中 test() 函数似乎不再有效?
最佳答案
class
和struct
的唯一区别是,在类型的定义中,默认访问级别是private
或public
分别。否则,在其他上下文中(例如这个),它们是相同的。
class masterStruct
和 struct masterStruct
是同一类型的两个名称。没有类型转换,因为只有一种类型。 C++ 允许关键字互换使用,因为默认访问级别只不过是定义中的一个次要实现细节。
只要不能使用某些 C++ 功能,就可以从 C 函数访问 C++ 类类型(用 class
或 struct
声明)。 virtual
函数、成员的混合访问保护等会影响成员在内存中的布局,因此 C 编译器将无法找到它们。 “POD”(普通旧数据)类是 C 可以理解的内容的轻微超集,因为也允许某些类型的单一继承。
非静态成员函数不会向内存中的类添加任何内容,因此它们不会影响其布局。它们只是具有特殊规则的普通函数,用于传递实现 this
的附加参数。 C 不需要知道它们,因此您可以安全地#ifndef __cplusplus
将它们取出。
但是,听起来您根本不像是在 C 代码中使用 masterStruct
,而是您只是通过 C 库传递一个 void*
并且回到你自己。在这种情况下,POD-ness 也没有什么区别。 void*
值只是一个标量值,传递时和返回时相同。它可以指向任何东西,也可以指向任何东西;没关系。
关于c++ - 将类转换为结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31689667/