0

夏の OO クラスの宿題をしていて、2 つのクラスを作成する必要があります。1 つが呼び出されSale、もう1 つが呼び出されRegisterます。Saleクラスを書きました。.hファイルは次のとおりです。

enum ItemType {BOOK, DVD, SOFTWARE, CREDIT};

class Sale
{
public:
    Sale();         // default constructor, 
            // sets numerical member data to 0

    void MakeSale(ItemType x, double amt);  

    ItemType Item();        // Returns the type of item in the sale
    double Price();     // Returns the price of the sale
    double Tax();       // Returns the amount of tax on the sale
    double Total();     // Returns the total price of the sale
    void Display();     // outputs sale info 

private:
    double price;   // price of item or amount of credit
    double tax;     // amount of sales tax 
    double total;   // final price once tax is added in.
    ItemType item;  // transaction type
};

クラスでは、メンバー データにオブジェクトRegisterの動的配列を含める必要があります。Sale

だから私の2つの質問は次のとおりです。

  • Sale自分のクラスから自分のクラスに継承する必要がありRegisterますか (もしそうなら、どのように)?
  • 動的配列の一般的な例を教えてください。

編集: ベクトルは使用できません。

4

3 に答える 3

3

継承は必要ありません。一般的な例:

std::vector<Sale> sales;

テンプレートが大好きです。

于 2012-06-22T02:06:58.683 に答える
2

いいえ、この場合、継承は適切ではありません。Registerクラスのフィールドとして、販売数と配列のサイズを追跡する必要があります。クラス定義にはこれが含まれます

class Register{
    private:
        int numSales;
        int arraySize;
        Sale* sales;
    public:
        Register();
        ~Register();
        void MakeSale(Sale);        
};

Register::Register(){
    numSales = 0;
    arraySize = 5;
    sales = new Sale[arraySize];
}
void Register::MakeSale(Sale s){
    if(numSales == arraySize){
        arraySize += 5;
        Sale * tempArray = new Sale[arraySize];
        memcpy(tempArray, sales, numSales * sizeof(Sale));
        delete [] sales;
        sales = tempArray;
    }
    sales[numSales] = s;
    ++numSales;
}

Register::~Register()
{
    delete [] sales;
}

これには、境界チェックや、販売時に必要なその他の作業は含まれていませんが、これが役立つことを願っています.

于 2012-06-22T14:55:34.420 に答える
0

ベクトルを使用できない場合は、std::list. 可能な限り標準のコンテナーを使用する必要があります。自家製のソリューションは劣る可能性があります。標準ライブラリは広範に最適化され、テストされています。車輪の再発明よりも良いことがあるのに、同じ投資をする必要があると本当に感じていますか?

std::list必要以上のスペースを割り当てないでください。ただし、いくつかの重大な制限があります。ベクトルおよびその他の形式の動的配列が連続しているという事実により、パフォーマンスが大幅に向上します。

ベクトルを使用できないことは、非常に恣意的な制限のように思えます。必要以上のスペースを割り当てるという事実は機能であり、バグではありません。これにより、コンテナーは、再割り当てに伴うコストのかかるコピーおよび/または移動操作を償却できます。インテリジェントなベクター実装では、メモリ不足の状況をチェックし、適切に処理する必要があります。そうでない場合は、標準ライブラリの実装にパッチを送信するか、新しい実装に移行する必要があります。しかし、説明のない恣意的な制約を課す、例えば:

この配列には 5 つ以上の未使用スロットがあってはなりません (つまり、割り当てられたスペースの数は、実際に実際のデータで埋められたスロットの数よりも多くても 5 つ大きくてもかまいません)。

悪い習慣です。FIVEという数字はどこから来たのですか?2 のべき乗でもありません。を使用してこの制限を回避したい場合はstd::vector::reserve、おそらくそれが最善の策です。しかし、そのすべての簿記を行う必要はありません。

そして、他のすべての人に同意します。継承は、ここで必要なものではありません。

于 2012-06-22T15:11:18.670 に答える