我有这个:
class masterStruct {
public:
int counter;
bool synchronized;
std::string slaveIDs[3];
void test() { counter = 0; }
}
我的班级定义如下:
class MasterInterface {
public:
struct masterStruct masStruct;
}
我在C风格的回调函数中使用masStruct。
我的问题是:test()函数会发生什么?我知道struct和class基本相同,类默认成员变量设置为private。为什么c ++允许在这种情况下将类转换为struct,其中test()函数似乎不再有效?
答案 0 :(得分:4)
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*
值只是一个标量值,当你传递它并将它取回时它将是相同的。它可以指向任何东西,或者什么都不是;没关系。
答案 1 :(得分:1)
Why does c++ allow casting class to struct in this case, where the test() function
seems to be no longer valid?
在C ++中,struct
也可以有函数。因此,您可以将class
对象强制转换为相应struct
的对象,并通过该struct
对象访问成员函数。请注意,原始public
定义中的访问说明符(private
,protected
或class
)决定了如何访问成员函数。转换为struct
不会将这些函数重新定义为public
,您可能会对此感到疑惑。
我想您真正的问题是为什么C ++ struct
(或原始问题中的class
)可以传递给C语言中没有成员函数概念的C API?
由于C ++中支持普通旧数据(POD)类型,因此这是可行的。 C ++中的POD对象可以与C互换。这就是为什么你可以将它传递给C API。简而言之,A POD类型是struct
或class
,没有用户定义的构造函数,析构函数和虚拟成员函数,这正是您的情况。有关详细讨论,请参阅this thread。