0

だから私は私のOOクラスのためにこのプロジェクトをやっています。SaleとRegisterの2つのクラスを作成する必要があります。私はSaleとRegisterのほとんどを書きました。私の唯一の問題は(現時点では)、レジスタークラスから販売オブジェクトのプライベートメンバーデータにアクセスできないように見えることです。

セールヘッダー:

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 (described below)

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

ヘッダーを登録します。

class Register{
public:

Register(int ident, int amount);
~Register();
int GetID(){return identification;}
int GetAmount(){return amountMoney;}
void RingUpSale(ItemType item, int basePrice);
void ShowLast();
void ShowAll();
void Cancel();
int SalesTax(int n);

private:

int identification;
int amountMoney;
int listSize = 5;
int numSales;
Sale* sale;
};

そのため、今関数を作成しようとしていRingUpSale()ますが、プライベートフィールドにアクセスできないようです。これが私のコードです:

void Register::RingUpSale(ItemType item, int basePrice){
if(numSales == listSize){
        listSize += 5;
        Sale * tempArray = new Sale[listSize];
        memcpy(tempArray, sale, numSales * sizeof(Sale));
        delete [] sale;
        sale = tempArray;
    }
    sale[numSales]->item = item; //this works for some reason
    sale[numSales]->total = basePrice; // this doesn't
    if(item == 'CREDIT'){ 
            sale[numSales]->tax = 0; // and this doesn't
            sale[numSales]->total = basePrice; // and neither does this
            amountMoney -= basePrice;
    }
    ++numSales;
}

販売オブジェクトの合計フィールドと税金フィールドを設定しようとすると、Eclipseでエラーが発生します。

"Field 'total' cannot be resolved"

これがなぜなのか、どうやって修正するのかわかりません。どんな助けでもいただければ幸いです。そして、はい、必要に応じて#include "sale.h"とを追加しました。#include "register.h"

4

1 に答える 1

0
  1. 最後のスニペットであなたは言いますif(item == 'CREDIT')が、これは多くの理由で間違っています。一重引用符は、単一文字にのみ使用されます。'item'は、列挙型であるタイプ'ItemType'です。if(item == CREDIT)CREDITは列挙型要素として定義されているため、使用する必要があります。そうでなければ、そのステートメントは、あなたがしたいこととは何の関係もない振る舞いをもたらします。

  2. コンストラクターの初期化を維持するのが最善だと思います(listSizeを参照)。

  3. クラス外からプライベートメンバーにアクセスすることはできません。コードの一部を別のクラスに外部化するか、必要に応じてパラメーターを使用してその処理を実行するパブリック関数を使用可能にするか、フレンドクラスを作成する必要があります(これは、設計が悪いことを示しているため、ほとんどの場合、嫌われていると思います(別名 " Xのやり方がわからないので、Yに頼ります」)。

さらにサポートが必要な場合は、明日コードを作成できるかもしれませんが、今日は少し遅れています。

于 2012-06-23T04:45:52.760 に答える