2012-06-23 3 views
0

Так что я делаю этот проект для своего класса OO. Нам нужно создать два класса: «Продажа и регистрация». Я написал Продажа и большую часть Регистра. Моя единственная проблема (на данный момент) заключается в том, что я не могу получить доступ к частным данным элемента объекта продажи из моего класса регистра.Проблема с доступом к данным частных объектов

Продажи заголовок:

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" там, где это необходимо.

+3

Это идея сделать их «частными», чтобы другие не могли с ними пообщаться. Не могла ли функция «MakeSale» помочь вам? –

ответ

0
  1. В вашем последнем фрагменте вы скажете if(item == 'CREDIT'), но это неверно по многим причинам. Одиночные кавычки используются только для одиночных символов. «item» имеет тип «ItemType», который является перечислением. Вы должны использовать if(item == CREDIT), потому что CREDIT определяется как элемент перечисления. Это утверждение в противном случае приводит к поведению, которое не имеет никакого отношения к тому, что вы хотите.

  2. Я думаю, что лучше сохранить инициализацию конструктора (см. ListSize).

  3. Вы не можете получить доступ к личным членам из-за пределов класса. Вы должны либо вытеснить некоторые части кода в другой класс, сделать общедоступные функции доступными, которые будут выполнять эту обработку с параметрами, если это необходимо, или сделать классы друзей (которые, как мне кажется, в большинстве случаев недовольны, поскольку это признак плохого дизайна (он же " Я не знаю, как сделать X, так что я прибегать к Y ").

Если вам нужна дополнительная помощь, может быть, я могу придумать какой-то код для вас завтра, это немного поздно сегодня.

+0

Думаю, он может захотеть, чтобы мы сделали некоторые вещи друзьям Продавца, чтобы зарегистрироваться, или, возможно, наследует определенные вещи от продажи в Регисте р. Однако я не могу добавить публичные функции. –

+0

Почему бы не использовать MakeSale()? – ApplePie

Смежные вопросы