如何从c中访问cpp类中的结构变量?

问题描述:

样品如:如何从c中访问cpp类中的结构变量?

messageStruct.hpp

class MessageStructure_t{ 

public: 

struct MsgData_t { 

    float a; 
    int i; 

}__attribute__((packed))msgdata_m; 

};//classs end 

我已经在我的项目Application.c文件。我需要在这里访问结构变量。 两者是不同的,一个.HPP和其他.C

我怎样才能做到这一点?

希望你的关注。

+0

注:.HPP和.c的只是文件扩展名。您应该谈论语言,如果这是您的担心,例如“如何从C模块访问C++结构”或类似的东西。 – 2010-01-26 09:12:15

+0

感谢您的信息我们的主席 – user46646 2010-01-26 09:16:09

+0

如果我理解正确,您有一个C++类的实例,并且您需要从C中访问该实例的数据字段。但是这只会引出C如何访问该对象的问题?当然,C无法传递类实例。那么你在C中已经拥有了什么? – sbi 2010-01-26 09:25:23

您可以定义在一个单独的头细msg_data.h的结构,然后将其包含在这两个项目。如果需要,您可能需要将MessageStructure_t指针指向MsgData_t。

因此MsgData.h:

struct MsgData_t { 
    float a; 
    int i; 
}__attribute__((packed)); 

messageStruct.hpp:

#include "MsgData.h" 

class MessageStructure_t { 
    public: 
    MsgData_t msgdata_m; 
} 

Appliaction.c:

#include "MsgData.h" 

//... 
+0

现在做填补CLASSE的结构变量,但我没有改变CPP类 – user46646 2010-01-26 09:22:08

+0

许可这是不够的,因为你不能访问数据在C班。这需要一个免费的功能。但是,您不能简单地将该类的对象传递给该函数,因为C不能理解类... – sbi 2010-01-26 09:22:53

+0

如果我使用extern在c中创建dt结构的变量,如下所示: MessageStructure_t :: MsgData_t obj_MsgData_t; – user46646 2010-01-26 09:26:59

我认为最好的方式是创建一个外部“C”功能访问该结构。

+0

但是,即使这也引发了一个问题,那就是如何将一个类实例从C. – sbi 2010-01-26 09:38:04

+0

@sbi传递给该方法。我不确定对此有何不确定性或神秘性。你可以创建包装这些方法的'extern“C”'函数。如果需要的话,你也可以编写一个'MessageStructure_Create()'来包装'new'和构造函数,'MessageStructure_Free()'来包装'delete'。不知道该类型应该是什么?从'void *'做一个'typedef'。您可以为字段编写访问器函数。 – asveikau 2010-01-26 09:49:13

+0

@asveikau:见http://*.com/questions/2138337/how-to-access-a-structure-variable-which-is-inside-a-cpp-class-from-c/21​​38546#2138546': O)' – sbi 2010-01-26 09:56:20

当你想从C访问C++类和它们的对象,周围有几个知名的图案。谷歌为他们。

一个简单的一种是把它包在一块OO的C:

typedef void* my_handle_t; 

handle_t create(void); // returns address of new'ed object 
void destroy(handle_t); // deletes object 

MsgData_t* get_data(handle_t); // returns address of data in object 

这使得如何让MsgData_t从C.访问的问题,我看到三种可能性:

  1. 举动它的定义到自己的头(IMO最好,但你已经说过你不允许这样做)
  2. 重复它的定义(容易,但IMO最差的替代)
  3. 拨弄预处理器(#ifndef __cplusplus),使一个C解析器的C++头访问(hackish的,但避免了#2的代码重复)