2015-06-14 26 views
1

我是新來的C語言編程,並作爲一個小型的項目,我決定嘗試在一個文件中使用GenericStack.h OOP風格結構來實現在C組,如下圖所示:取消引用指向不完全類型

void _GENERICSTACK0001(void *,void *); 
void *_GENERICSTACK0002(void *); 
int _GENERICSTACK0003(void *); 

typedef struct 
{ 
    struct GenericStackNode *next; 
    void *data; 
    int type; 
}GenericStackNode; 

typedef struct 
{ 
    struct GenericStackNode *top; 
    int count; 
    void (*add)(void *,void *); 
    void *(*pop)(void *); 
    int (*hasNext)(void *); 
    int (*getCount)(void *); 
}GenericStack; 

GenericStack newGenericStack() 
{ 
    GenericStack *genStack = malloc(sizeof(GenericStack)); 
    genStack->add = _GENERICSTACK0001; 
    genStack->pop = _GENERICSTACK0002; 
    genStack->hasNext = _GENERICSTACK0003; 
    genStack->getCount = _GENERICSTACK0003; 
    genStack->top=NULL; 
    genStack->count = 0; 
    return *genStack; 
} 

void _GENERICSTACK0001(void *self,void *data)//add 
{ 
    GenericStack *genStack = self; 
    if(genStack->top == NULL) 
    { 
     genStack->top = malloc(sizeof(GenericStackNode)); 
     genStack->top->next = NULL; 
     genStack->top->type = 0; 
     genStack->top->data = data; 
    } 
    else 
    { 
     GenericStackNode *temp = malloc(sizeof(GenericStackNode)); 
     temp->next = genStack->top; 
     temp->type = 0; 
     temp->data = data; 
     genStack->top = temp; 
     genStack->count++; 
    } 
} 

void *_GENERICSTACK0002(void *self)//pop 
{ 
    GenericStack *genStack = self; 
    void *data = NULL; 
    if(genStack->top == NULL) 
    { 
     return data; 
    } 
    else 
    { 
     GenericStackNode *temp = genStack->top; 
     genStack->top = genStack->top->next; 
     data = temp->data; 
     free(temp); 
     genStack->count--; 
     return data; 
    } 
} 

int _GENERICSTACK0003(void *self) 
{ 
    GenericStack *genStack = self; 
    return genStack->count; 
} 

所有我需要知道的是爲什麼(以及許多其他),我得到的特定錯誤:

GenericStack.h:41:16: error: dereferencing pointer to incomplete type 
    genStack->top->type = 0; 

我已經檢查關於計算器其他答案「提領指向不完全類型」,但我似乎無法理解。

+0

關於C問題的標籤? –

+0

是的,我想嘗試在C中使用OOP風格的編程:) – user1979637

+0

它被稱爲C++,它比現在想象的要強大得多.. –

回答

1

你從GenericStack得到一個錯誤,但你在這兩個GenericStackGenericStackNode有問題。

在C中,struct XX是不同的類型。當你寫:

struct GenericStackNode *next; 

它聲明瞭一個名爲struct GenericStackNode類型(以及它是一個指向該類型的成員)。這種類型是不完整的,因爲你沒有提供結構定義。

該類型可以通過稍後提供一個結構定義來完成,但您從不這樣做。相反,您可以定義一個未命名的結構體並輸入typedef GenericStackNode,但這對struct GenericStackNode沒有影響。

然後,struct GenericStackNode *top;仍然使用這個不完整的類型,而不是你在上面定義的結構。

假設你的意思是這個指針是一個指針,它包含在同一類型的結構,你可以使用此模式爲您的結構組成:

typedef struct X X; 

struct X 
{ 
    X *ptr; 
}; 

人們常常與結構結合的typedef但我發現將它們分開是更清楚的。

0

你已經輸入定義GenericStackNode作爲一個類型,沒有必要爲struct GenericStackNode了,只是GenericStackNode

typedef struct 
{ 
    struct GenericStackNode *top; 
... 
} 

應該只有

typedef struct 
{ 
    GenericStackNode *top; 
... 
} 

也,則不能使用GenericStackNode當你還沒有定義它時:

typedef struct 
{ 
    struct GenericStackNode *next; 
    void *data; 
    int type; 
} GenericStackNode ; 

你可以寫:

typedef struct GenericStackNode 
{ 
    struct GenericStackNode *next; 
    void *data; 
    int type; 
} GenericStackNode ; 
+0

由於GenericStackNode沒有被定義,所以你的建議修正將不起作用 –

+0

添加到答案 –

+0

請你可以解釋最後的代碼段更詳細? – user1979637

相關問題