将类转换为结构

时间:2015-07-29 01:12:02

标签: c++ class struct

我有这个:

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()函数似乎不再有效?

2 个答案:

答案 0 :(得分:4)

classstruct之间的唯一区别在于,在类型的定义中,默认访问级别分别为privatepublic。否则,在其他情况下(例如这个),它们是相同的。

class masterStructstruct masterStruct是同一类型的两个名称。没有投射,因为只有一种类型。 C ++允许关键字可以互换使用,因为默认访问级别只不过是定义中的次要实现细节。

只要不能使用某些C ++功能,就可以从C函数访问C ++类类型(用classstruct声明)。 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定义中的访问说明符(privateprotectedclass)决定了如何访问成员函数。转换为struct不会将这些函数重新定义为public,您可能会对此感到疑惑。

我想您真正的问题是为什么C ++ struct(或原始问题中的class)可以传递给C语言中没有成员函数概念的C API?

由于C ++中支持普通旧数据(POD)类型,因此这是可行的。 C ++中的POD对象可以与C互换。这就是为什么你可以将它传递给C API。简而言之,A POD类型是structclass,没有用户定义的构造函数,析构函数和虚拟成员函数,这正是您的情况。有关详细讨论,请参阅this thread