2012-10-11 118 views
0

我有4個C++文件,2個頭文件和2個.cc文件。這只是一個概念的證明,但我似乎無法做到。C++中的抽象類和純虛擬方法

我的第一個標題是這樣的:

#ifndef INT_LIST_H 
#define INT_LIST_H 
class IntList 
{ 
    public: 

    //Adds item to the end of the list 
    virtual void pushBack(int item) = 0; 
}; 
#endif 

我的第二個報頭使用第一,看起來像這樣:

#ifndef ArrayIntList_H 
#define ArrayIntList_H 
#include "IntList.h" 


class ArrayIntList : public IntList 
{ 
    private: 
     int* arrayList; 
     int* arrayLength; 

    public: 
     //Initializes the list with the given capacity and length 0 
     ArrayIntList(int capacity); 

     //Adds item to the end of the list 
     virtual void pushBack(int item) = 0; 

}; 
#endif 

我的第一個.cc文件填寫在前面類的方法:

#include <iostream> 
#include "ArrayIntList.h" 

ArrayIntList::ArrayIntList(int capacity) 
{ 
    //make an array on the heap with size capacity 
    arrayList = new int[capacity]; 
    //and length 0 
    arrayLength = 0; 
} 

void ArrayIntList::pushBack(int item) 
{ 
    arrayList[*arrayLength] = item; 
} 

這是我的主要功能:

#include <iostream> 
#include "ArrayIntList.h" 

int main(int argc, const char * argv[]) 
{ 
    ArrayIntList s(5); 
} 

當我在Xcode中運行它時,出現「變量ArrayIntList是抽象類」的錯誤 我不明白這是怎麼回事,因爲我在上面的.cc文件中定義了它。有任何想法嗎?

回答

4

在類ArrayIntList使用本

virtual void pushBack(int item); 

,而不是這個

virtual void pushBack(int item) = 0; 

的原因是,當你將一個0到函數聲明,你說這是「純」,或未實現。但是你正在這樣做(實現它)下面。

+0

賓果遊戲,你是一個生命的救星。你能解釋爲什麼嗎? – tknickman

+0

你打敗了我,完美。謝謝! – tknickman

+0

純粹的方法只是繼承類中實現的「承諾」。將0賦給函數聲明聲明它是「純的」。如果你嘗試用純方法實例化一個類,你會得到一個編譯器錯誤。 – imreal

3

您已將ArrayIntList::pushBack(int item)聲明爲純虛函數。這就是= 0所做的。從ArrayIntList.h中刪除= 0

另外:你正在使用int指針而不是int來跟蹤你的數組長度。

2

在聲明ArrayIntList類時,需要從方法聲明中刪除「= 0」。你可能還需要聲明arrayLength是一個int而不是一個指向int的指針。最後,因爲你在你的構造數組分配內存,你應該聲明析構函數來釋放內存,當對象被銷燬:

class ArrayIntList : public IntList 
{ 
private: 
    int* arrayList; 
    int arrayLength; 

public: 
    //Initializes the list with the given capacity and length 0 
    ArrayIntList(int capacity); 

    virtual ~ArrayIntList() { delete arrayList; } 

    //Adds item to the end of the list 
    virtual void pushBack(int item); 

}; 

當然,要處理數組列表中的最好的辦法是使用std::vector<int>來代替,因此您不必手動處理內存分配和釋放

0

在類ArrayIntList中聲明瞭一個純虛擬的「virtual void pushBack(int item)= 0;」您已經在抽象父類IntList中聲明瞭它。你所需要做的就是將它聲明爲「virtual void pushBack(int item);」。

0

一個抽象基類不能從另一個抽象基類繼承,從公式中刪除

= 0; 

在ArrayIntList:

virtual void pushBack(int item) = 0;