0

4つのC++ファイル、2つのヘッダー、および2つの.ccファイルがあります。これは概念実証にすぎませんが、正しく理解できないようです。

私の最初のヘッダーは次のようになります。

#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

私の2番目のヘッダーは最初のヘッダーを使用しており、次のようになります。

#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で実行すると、「Variable ArrayIntListは抽象クラスです」というエラーが表示されます。上記の.ccファイルで定義したため、これがどのように行われるのかわかりません。何か案は?

4

5 に答える 5

4

クラスArrayIntListでこれを使用します

virtual void pushBack(int item);

これの代わりに

virtual void pushBack(int item) = 0;

その理由は、関数宣言に0を割り当てると、それが「純粋」である、または実装されていないということになるためです。しかし、あなたはそれを以下で行っています(それを実装しています)。

于 2012-10-11T02:25:36.750 に答える
3

ArrayIntList::pushBack(int item)純粋仮想関数として宣言されています。それはそれがすること = 0です。= 0ArrayIntList.hから削除します。

また、配列の長さを追跡するために、intの代わりにintポインターを使用しています。

于 2012-10-11T02:28:23.833 に答える
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>代わりに a を使用することです。そのため、メモリの割り当てと割り当て解除を手動で処理する必要はありません。

于 2012-10-11T02:29:40.170 に答える
0

クラス ArrayIntList では、純粋仮想「仮想 void pushBack(int item) = 0;」を宣言しています。これは、抽象親 IntList で既に宣言されています。「virtual void pushBack(int item);」と宣言するだけです。

于 2012-10-11T02:35:22.520 に答える
0

抽象基底クラスは別の抽象基底クラスから継承できません。

= 0;

ArrayIntList の式から:

virtual void pushBack(int item) = 0;
于 2012-10-11T04:01:37.210 に答える