簡體   English   中英

將類轉換為結構

[英]Casting class into a 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本質上是相同的,並且class默認成員變量設置為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強度也不起作用。 void*值只是一個標量值,傳遞和返回時都相同。 它可能指向任何東西,或者什么也沒有。 沒關系

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的對象,並通過該struct對象訪問成員函數。 請注意,原始class定義中的訪問說明符( publicprivateprotected )確定如何訪問成員函數。 轉換為struct不會將這些函數重新定義為public ,您可能會感到奇怪。

我猜你真正的問題是,為什么一個C ++ struct (或class在你原來的問題)可以傳遞給一個C API那里是在語言中沒有成員函數的概念?

由於C ++支持純原始數據(POD)類型,因此可以這樣做。 C ++中的POD對象可與C互換。因此,您可以將其傳遞給C API。 簡而言之,POD類型是沒有用戶定義的構造函數,析構函數和虛擬成員函數的structclass ,這正是您的情況。 有關詳細討論,請參考此線程

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM