2013-01-19 16 views
2

我想模仿面向對象編程,所以在C++中,讓我們來看看下面的C代碼:如何處理不同的數據類型,在一個陣列中,在C

typedef struct tAnimal{ 
    char * name; 
    int age; 
}tAnimal; 

typedef struct tAnimal2{ 
    char * name; 
    int age; 
    float size; 
}tAnimal2; 

在C++中,你可以創建一個從同一個類繼承的不同對象的表。 我願做同樣的在C,讓我們來看看下面的代碼:

tAnimal ** tab; 
tab = malloc(sizeof(tAnimal*)*2); 
tab[0] = malloc(sizeof(tAnimal)); 
tab[1] = malloc(sizeof(tAnimal2)); 

注意,分配工作,因爲的malloc返回一個空指針,和C不需要鑄造。但我仍然無法訪問size字段,因爲tab元素的類型畢竟是tAnimal。

有沒有辦法解決這個問題?,我想遠離void **指針。

+1

[**這是一個項目(一本書)將幫助你在C **中開發面向對象特性](http://www.cs.rit.edu/~ats/books/ooc.pdf) –

+2

「在C++中,您可以創建一個由同一類繼承的不同對象的表「不是真的,只有指向對象的指針!如果你使用的對象,你將他們切片:http://stackoverflow.com/questions/274626/what-is-the-slicing-problem-in-c – fscan

回答

0

如果要訪問大小字段,則必須將指針指向tAnimal2。請注意,C++也是如此。

您可以通過在第二年初嵌入第一個結構類型的模擬繼承:

struct tAnimal{ 
    char * name; 
    int age; 
}; 

struct tAnimal2{ 
    struct tAnimal parent; 

    float size; 
}; 
+0

這就是我想要做的實際上,它是模擬繼承,但問題仍然存在。我正在實施一種生成C代碼的面嚮對象語言,這是我面臨的C語言限制之一,並且仍在處理中。非常感謝您的幫助。 – sorakun

3

在C語言中是很常見使用的結構與類型標誌,以及數據的union

typedef enum 
{ 
    Animal1, 
    Animal2 
} AnimalType; 

struct Animal 
{ 
    AnimalType type; 

    union 
    { 
     tAnimal animal; 
     tAnimal2 animal2; 
    }; 
}; 

現在您可以創建一個Animal結構的數組。

+0

是的,我也會這樣做。但是請注意,數組中的所有成員的大小都是(tAnimal2 + enum)。 –

+2

我認爲這不是他想要的,從示例代碼中我認爲他想要C++樣式繼承(例如:指向基礎對象的指針列表)。 – fscan

+0

@fscan OP寫道「我想遠離void **指針」_。在這種情況下,我可以看到唯一的解決方案是使用'union',因爲結構在大小上有所不同,因此不能在數組中使用。 –

0

要訪問tab[1]中的size字段,您可以將指針轉換爲tAnimal2指針。

tAnimal2* panimal2 = (tAnimal2*) tab[1]; 
panimal2->size = 1.0; 

但是這種做法很容易出現數據損壞,因爲你需要一個方法來確保你投以tAnimal2表的元素的確是tAnimal2的一個實例。您可以使用Joachim Pileborg建議檢查對象類型的其他類型字段。

相關問題