c++ - 将类转换为结构

标签 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() 函数发生了什么?我知道结构和类本质上是相同的,类默认成员变量设置为私有(private)。在这种情况下,为什么 c++ 允许将类转换为结构,其中 test() 函数似乎不再有效?

最佳答案

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* 值只是一个标量值,传递时和返回时相同。它可以指向任何东西,也可以指向任何东西;没关系。

关于c++ - 将类转换为结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31689667/

相关文章:

android - 如何使用android-ndk?

c++ - 成员变量不保存从函数成员添加到它的值

golang 为什么比较两个指向结构的变量表现不同?

c# - 在 C# 中构建结构时出错

c++ - 从 std::vector 的开头移除

c++ - 如何将 ASN1_TIME 转换为 std::string

C++ : convert symbols to code line numbers programmatically

c++ - 错误 C2011 : '' : 'class' type redefinition

c# - 从列表中填充组合框

c++ - 使用结构体和指针时出现错误