2010-01-26 71 views
0

樣品如:如何從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

回答

3

您可以定義在一個單獨的頭細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

1

我認爲最好的方式是創建一個外部「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://stackoverflow.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

2

當你想從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的代碼重複)